🔥

【Ruby】chompとchomp!の違い

2023/04/23に公開

chompとchomp!はどちらも改行を削除してくれるだけのようなイメージですが、
どのような違いがあるか試してみました。

まずはchompを見ていきましょう。

#改行1つ
str = "Good morning
"
new_str = str.chomp
p str     # => "Good mornig\n"
p new_str # => "Good mornig"

上記では文字列の末尾の改行を消してくれています。
改行を増やしたパターンも見てみましょう。

#改行2つ
str = "Good morning
	
"
new_str = str.chomp
p str     # => "Good mornig\n\n"
p new_str # => "Good mornig\n"

上記でも文字列末尾の改行を消してくれていますが、改行が1つ残っています。

続いてchomp!を見ていきましょう。

#改行1つ
str = "Good morning
"
new_str = str.chomp!
p str    # => "Good morning"
p new_str # => "Good morning"

あれれ!? 元の変数strの文字列まで改行が無くなっています。

つまり、
chompは元の文字列の末尾の改行を削除したしたものを新しい文字列として返し、
chomp!は元の文字列の末尾の改行を削除している。

と、ここまでは末尾に改行がある場合の話。
改行がない場合を見てみましょう。

# 文字列の末尾に改行がない場合
str = "Good morning"
new_str = str.chomp
p str    # => "Good morning"
p new_str # => "Good morning"

chompは予想通りの結果だが、

str = "Good morning"
new_str = str.chomp!
p str    # => "Good morning"
p new_str # => nil

chomp!だとnilが出力されました。

実は、chompとchomp!は文字列を引数にできます。

str = "Good morning"
new_str = str.chomp(" morning")
p str    # => "Good morning"
p new_str # => "Good"
str = "Good morning"
new_str = str.chomp!(" morning")
p str    # => "Good"
p new_str # => "Good"

chomp!について、もう一つ見ていきましょう。

str = "Good"
new_str = str.chomp!(" morning")
p str    # => "Good"
p new_str # => "nil"

またもやnilが出現しました。

chompとchomp!は引数を指定することで末尾にある任意の文字列を削除することができます。
省略することもできます。引数を省略した場合は、末尾の改行を削除します。
引数を省略したときは、

chomp("\n")
chomp!("\n")

このようになっているということですね。

指定した文字列が末尾に存在しない場合、chomp!はnilを返します。

chompメソッドは使いやすいですが、
chomp!メソッドを使う際には少し注意が必要ですね。

Discussion