11
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Rubyのchomp!にだまされる!

Last updated at Posted at 2020-06-05

最後の改行を取り除いた文字列をメソッドに渡したいとき

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が返されてしまう場合があってハマった、という話でした。

追記

以下の記事に整理されていました。

11
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?