🎉

[Feature #20885] String#gsub? を追加する提案

2024/10/30に公開

[Feature #20885] String#gsub?

  • sub / gsub を実行したときに一致する場合は新しい文字列を返し、そうでない場合は nil を返す String#gsub? を追加する提案
  • String#gsub! の戻り値がこの挙動になっており #gsub?str.dup.gsub!(...) と同等の挙動になります
  • 提示されているユースケースは以下の通り
# gsub で文字列が変更されたかどうかを確認する
newstr = str.gsub?(rx,repl) or raise "str did not contain expected value"

# 文字列が変更されたときに処理を実行する
if str = obj.title.gsub?(rx, repl)
  obj.title = str
  obj.save
end

# 変更がない場合は新しい文字列の割当を防ぐ (str がそのまま代入される)
str = str.gsub?(rx, repl) || str
  • どういうときに使うんだろう?と思っていたんですがユースケースを見るとままあるんですかね?
  • とはいえ #gsub? っていう名前だと true / false が返ってくる印象がめちゃくちゃ強いのですごい違和感がある…
  • 本当は既存の #gsub の戻り値がこういう挙動になっているとよいと思うんですがいまから変えるのは難しいですしねえ
  • ちなみに #gsub? を利用すると #gsub / gsub! が以下のように簡素に実装できるともコメントされていますねーはえー
def gsub!(...)
  modified = gsub?(...) and replace(modified)
end

def gsub(...)
  gsub?(...) or dup
end
GitHubで編集を提案

Discussion