paizaの解き方記事などみると、chompではなく、chomp!を見ることがあった。
違いを理解したのでアウトプット。
!とは
破壊的な変更
Ruby の String クラスは mutable です。つまり、オブジェクト自体を破壊的に変更できます。
「破壊的な変更」とは、あるオブジェクトの内容自体を変化させることです。
引用:Rubyリファレンス
元々のオブジェクトを変更(破壊!)してしまう。
chompもchomp!も文字末尾の改行を取り除けるメソッド。
【補足】getsなどで受け取った入力は末尾に改行コードが入っている。例↓
irbでの実行結果
string = gets
hello # helloと入力する
=> "hello\n" # \nは改行コード
chompの場合
string = gets # helloと入力
p string
=> "hello\n"
string.chomp # stringの末尾改行を取り除く
=> "hello"
p string
=> "hello\n" # stringオブジェクトは変わらない
new_string = string.chomp # sringの末尾改行を取り除いたものを変数に代入
p new_string
=> "hello" # 変数代入すれば末尾改行なしの文字が使える
string = gets.chomp # 入力段階でchompしておけばstringの末尾改行を取り除ける
p string
=> "hello"
chompは一時的にオブジェクトの改行を取り除けるが、オブジェクト自体から改行を取り除いたわけではない。
chomp!の場合
string = gets # helloと入力
p string
=> "hello\n"
string.chomp!
=> "hello"
p string
=> "hello" # stringは改行のない文字列に変わった
new_string = string.chomp! # 変数代入してももちろん改行は取り除かれたまま
p new_string
=> "hello"
string = gets.chomp! # 入力時点で文字列から改行を取り除いて変数代入しているので改行はない
p string
=> "hello"
破壊的変更なので、オブジェクト自体を変更させている。
まとめ
今回はchompとchomp!でしたが、!をつけて使用できるメソッドは他にもある。
破壊的な変更(!)をつけたメソッドは使用時注意が必要!
かと言って改行コードがついたままのオブジェクトを使い続けるのもエラーの原因。
使用時にオブジェクトの目的をよく理解することが大事だと学びました。