Feature #14443

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

Added by sawa (Tsuyoshi Sawada) 9 months ago. Updated 9 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)Rejected


#1 [ruby-core:85387] Updated by sawa (Tsuyoshi Sawada) 9 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.

#2 Updated by shyouhei (Shyouhei Urabe) 9 months ago

#3 [ruby-core:85388] Updated by shyouhei (Shyouhei Urabe) 9 months ago

I remember this was rejected.

#4 [ruby-core:85400] Updated by shevegen (Robert A. Heiler) 9 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