gets.chomp.to_iのchomp不要論

6ヶ月ぐらいまともにコード書いてないことに気づいてしまったので、AtCoderで練習しようと思った。 で、rubyで始めたんだけど気になることがあった。 提出された人のコード見てると

gets.to_i

してる人と

gets.chomp.to_i

してる人がいる。 まあ、どちらとも通ってるのでgets.to_iが正しいんだろうなと思った。 パッと見でchomp使ってる人と使ってない人コード見比べてもね

ググる

結論としてはto_iに妥当ではない文字が入力された場合無視され、どんな数かわかんねーよ状態なら0が返る。

"100万回生きた猫".to_i #=> 100
"ハゲの髪の毛".to_i #=> 0

もちろん改行文字が入っていた場合も同じ。

"1\n".to_i #=> 1

でもchomp使って改行除いてからの方が速いんじゃね派がいるかもしれないから簡単にベンチマーク測った。

require 'benchmark'

n = 10_000_000

Benchmark.bm(9) do |x|
  x.report("   chomp:") { n.times { "1\n".chomp.to_i }}
  x.report("no chomp:") { n.times { "1\n".to_i }}
end
                user     system      total        real
   chomp:   3.650000   0.000000   3.650000 (  3.655401)
no chomp:   2.410000   0.000000   2.410000 (  2.409925)

chomp使わない方が速い。 まあそうだろうな。

結論

gets.to_iを使う。