From: "matz (Yukihiro Matsumoto) via ruby-core" Date: 2024-12-18T06:11:41+00:00 Subject: [ruby-core:120289] [Ruby master Feature#20885] String#gsub? Issue #20885 has been updated by matz (Yukihiro Matsumoto). I am not positive for adding `gsub?`. It's not a predicate, after all. Matz. ---------------------------------------- Feature #20885: String#gsub? https://bugs.ruby-lang.org/issues/20885#change-111054 * Author: Dan0042 (Daniel DeLorme) * Status: Open ---------------------------------------- I would like a variation of sub/gsub that returns a new string if there is a match, or nil otherwise. This can be currently done with `str.dup.gsub!(...)` at the mere cost of 2 unnecessary extra allocations due to String#dup TBH I'm not sure we need yet another gsub method, but what gets me here is that `gsub?` is the primitive operation from which `gsub` and `gsub!` are made. Internally, these two methods work like this: ```ruby def gsub!(...) modified = gsub?(...) and replace(modified) end def gsub(...) gsub?(...) or dup end ``` We can efficiently derive these two methods from `gsub?`, but we cannot efficiently implement `gsub?` in ruby, so it feels regrettable to me that `gsub?` is not available as a built-in. Use cases include: ```ruby # ensure gsub has modified the string newstr = str.gsub?(rx,repl) or raise "str did not contain expected value" # take an action if the string is modified if str = obj.title.gsub?(rx,repl) obj.title = str obj.save end # avoid allocating a new string if there is no change str = str.gsub?(rx,repl) || str ``` -- https://bugs.ruby-lang.org/ ______________________________________________ ruby-core mailing list -- ruby-core@ml.ruby-lang.org To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org ruby-core info -- https://ml.ruby-lang.org/mailman3/lists/ruby-core.ml.ruby-lang.org/