Project

General

Profile

Actions

Feature #20885

open

String#gsub?

Added by Dan0042 (Daniel DeLorme) about 1 month ago. Updated 4 days ago.

Status:
Open
Assignee:
-
Target version:
-
[ruby-core:119883]

Description

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:

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:

# 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
Actions #1

Updated by Dan0042 (Daniel DeLorme) about 1 month ago

  • Description updated (diff)

Updated by matz (Yukihiro Matsumoto) 4 days ago

I am not positive for adding gsub?. It's not a predicate, after all.

Matz.

Updated by Dan0042 (Daniel DeLorme) 4 days ago

Ah, you mean it doesn't return strictly true/false? That's a good point, although there are precedents like Numeric#nonzero?

But I'm not so attached to the name "gsub?" itself, it just happened to be the one that made the most sense to me. We could go with anything really. But I'm interested in discussing if this method, under another name, has a place in Ruby core.

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0