String#to_iは数値に変換できない文字列に対しても例外を返さない


Ruby on Railsを扱っていると、入力されたparamsに格納された値を取り扱うと思います。

paramsは基本的にはHash型ですが、格納されている値は基本的に文字型です。
これをデータ型変換しようとしたときにハマる可能性があるので注意しましょう。

String#to_iによる変換

irb(main):003:0> '123'.to_i
=> 123
irb(main):004:0> 'hogehoge'.to_i
=> 0
irb(main):005:0> nil.to_i
=> 0

なんと、不正な文字列を0として評価してしまいました。nilを代入しても0が返ってきてしまいます。

Integer()による変換

irb(main):006:0> Integer('123')
=> 123
irb(main):007:0> Integer('hogehoge')
irb(main):009:0> Integer(nil)
TypeError: can't convert nil into Integer
	from (irb):9:in `Integer'
	from (irb):9
	from /Users/yukito/.rbenv/versions/2.4.1/bin/irb:11:in `<main>'
irb(main):008:0> Integer('hogehoge')
ArgumentError: invalid value for Integer(): "hogehoge"
	from (irb):8:in `Integer'
	from (irb):8
	from /Users/yukito/.rbenv/versions/2.4.1/bin/irb:11:in `<main>'

Integer()で数値を囲んで変換する方式は、不正な値(nilや文字列に変換できない文字列)が入っていると、エラーを投げて処理が中断されます。