このブログで何度も登場しているsplit
メソッドについて、発見があったので紹介します。
split
は、文字列を区切り文字で分割して配列に入れるメソッドですが、先頭と末尾の空白文字(改行文字など)を削除してくれるらしいのです!
split
の使用例
まずは、split
の基本から。
#引数を指定しなければ空白で分割する p "apple banana orange".split #=> ["apple", "banana", "orange"] #引数を渡すと任意の文字列や正規表現で分割できる p "リンゴとバナナとオレンジ".split("と") #=> ["リンゴ", "バナナ", "オレンジ"]
split
があればchomp
はいらない?
では本題に移ります。
昨日の記事でこんなコードを書きました。
n = gets.to_i n.times do #以下をn回繰り返す ary = gets.chomp.split #取得値をスペース区切りで分割し配列aryに要素として追加 puts "hello = #{ary[0]}, world = #{ary[1]}" #出力 end #=> hello = 2, world = 5 #=> hello = 3, world = 4
3行目のary = gets.chomp.split
のchomp
は、標準入力値に含まれる末尾の改行を削除するために書いていましたが、不要だったということですね。実際にchomp
を削除して実行してみたところ、同じ出力が得られました。
split
で改行が削除されることを確認してみます。以下のコードについて、入力値はa b c
(文字列でスペース区切り、末尾に改行が入る)とします。
input = gets #標準入力値を取得 p input #=> "a b c\n" p input.split #=> ["a", "b", "c"]
split
で改行コード\n
が削除されました!
改行コードは必ず削除されるわけではない
split
に引数を指定して、文字列で分割してみます。以下のコードについて、入力値はaとbとc
(文字列で末尾に改行が入る)とします。
input = gets p input #=> "aとbとc\n" p input.split('と') #=> ["a", "b", "c\n"]
改行コード\n
が入ったままです。
次に、正規表現を使って分割してみます。以下のコードについて、入力値はa,b,c
(文字列でコンマ区切り、末尾に改行が入る)とします。
input = gets p input #=> "a,b,c\n" p input.split(/,/) #=> ["a", "b", "c\n"]
このように、正規表現で分割するときも改行コードは削除されません。
リファレンスマニュアルは大事
to_iがあるならchompはいらないということを以前書きました。それを知ったのは、ブログを書くためにリファレンスマニュアルを読んでいたらそこに書いてあったからでした。
同様に空白文字を削除してくれるメソッドはたくさんあるのかもしれません。ネットで見かけたコードはchomp
とsplit
を一緒に使っているものばかりだったのでそれが正しいと思い込んでしまいました(間違いということでもないと思いますが)。きちんとリファレンスマニュアルを読むことは大切ですね。
split
のリファレンスマニュアルは前読んだはず…と思いながら以前のブログ記事を見返してみました。
split
は、文字列を区切り文字で分割して配列に入れるメソッドです。split(',')
のように引数に指定した任意の文字で分割することができます。 引数を省略すると空白文字(半角スペースや改行文字など)で分割されます。先頭と末尾の空白文字は削除されるので、chomp
は省略できるようです。
あれ?
先頭と末尾の空白文字は削除されるので、
chomp
は省略できるようです。
今日発見したつもりが、なんと3日前にも発見してました!笑
だってリファレンスマニュアルに書いてありますから。自分の忘れっぽさを再発見。
実行速度にも影響があるらしい
以前はとにかく標準入力値を取得したらchomp
するものだと思っていました。
今回のコードぐらいでは速度に変化はありませんでしたが、実務や競技プログラミングでは実行速度も気になるところなので、もっともっと勉強が必要です。
こちらのブログによると、chomp
でも速度に影響はあるようです。
leokun0210.hatenablog.com
まとめ
split
メソッドは、以下の場合、先頭と末尾の空白文字(改行コードなど)の削除もする。
- 引数(区切り文字)が指定されないとき
- 引数(区切り文字)として
nil
または' '
(半角スペース1つ)が指定されたとき
スペース以外の任意の文字列や正規表現で区切る場合、空白文字(改行コードなど)は削除されない。
引数にnil
やスペースを指定するのは引数を指定しないのと同じこと(かつ指定しないほうが速い)なので、split
は引数なしのとき先頭と末尾の空白文字を削除すると覚えればよさそうです。