🎉
[Feature #20885] String#gsub? を追加する提案
[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
Discussion