Feature #14443

Omit 'pattern' parameter in '(g)sub(!)' when 'hash' is given

Added by sawa (Tsuyoshi Sawada) 12 months ago. Updated 12 months ago.

Target version:


When (g)sub(!) takes a hash as the second argument, in almost all use cases, the first argument expresses the union of keys of the hash. In the following, /[abc]/ is the union of the keys "a", "b", "c".

"blahblah".sub(/[abc]/, {"a" => "A", "b" => "B", "c" => "C"})

I feel this redundant and not efficient. Hence I propose to let the current first argument be optional when a hash is given. The following:

"blahblah".sub("a" => "A", "b" => "B", "c" => "C")

should be equivalent to:

"blahblah".sub(pattern, {"a" => "A", "b" => "B", "c" => "C"})


pattern = Regexp.union(*{"a" => "A", "b" => "B", "c" => "C"}{|k| Regexp.escape(k)})

Related issues

Is duplicate of Ruby trunk - Feature #13016: String#gsub(hash)RejectedActions


Updated by sawa (Tsuyoshi Sawada) 12 months ago

If creation of the union is done within C-Ruby code, I believe that should be more efficient than having the pattern argument explicitly given and interpreted.


Updated by shyouhei (Shyouhei Urabe) 12 months ago

Updated by shyouhei (Shyouhei Urabe) 12 months ago

I remember this was rejected.

Updated by shevegen (Robert A. Heiler) 12 months ago

To quote from the other issue and what shyouhei wrote there:

"While I claimed the use of regular expression is an implementation detail that I don't want to care about, attendees there said it is better to expose compiled structure (be they regexp) for performance. I agree with that, so I give up this propossal."

Also available in: Atom PDF