最後の改行を取り除いた文字列をメソッドに渡したいとき
def foo(str)
p str
end
str = "abc\n"
foo(str.chomp) # "abc"
p str # "abc\n"
chomp
を使えばよい。
メソッドに渡すと同時に変数の中身も書き換えたいとき
str = "abc\n"
foo(str.chomp!) # "abc"
p str # "abc"
ビックリマークのついたchomp!
を使えばよい。str
変数の中身も書き換えてくれている。
文字列に改行がない場合はそのままで処理したい。chomp
は改行がなければきっとそのままにしてくれるだろう。
str = "abc"
foo(str.chomp) # "abc"
p str # "abc"
OK。
chomp!
も
str = "abc"
foo(str.chomp!) # nil
p str # "abc"
あれ?nil
?
公式ドキュメントを見ると、たしかに改行がない場合はnil
を返す、とある。
String#chomp! (Ruby 2.7.0 リファレンスマニュアル)
chomp! は通常 self を返しますが、取り除く改行がなかった場合は nil を返します。
わざわざnil
を返す仕様になっているのは、改行を取り除いた場合になにかをする、というコードが書けるようにでしょうか???
if str.chomp!
puts "chompしたよ!"
else
puts "chompしなかった"
end
思いがけずnil
が返されてしまう場合があってハマった、という話でした。
追記
以下の記事に整理されていました。