次をどうやって判定しているんだろう、と思ったらこんなメソッドあるんだ的なメモ
環境
$ ruby -v ruby 2.3.7p456 (2018-03-28 revision 63024) [universal.x86_64-darwin18]
ドキュメント
Range#each は各要素の succ メソッドを使用してイテレーションするようになりました。 - instance method Range#each (Ruby 2.6.0)
とあり、succはどういうものかというと
self の「次の」文字列を返します。 - instance method String#next (Ruby 2.6.0)
実例
たとえば、以下のように ..
でRangeクラスを作る
("a".."d")
eachすると以下のようになる
("a".."d").each { |val| p val} > "a" > "b" > "c" > "d"
インクリメンタルされるオブジェクトの注意
文字列の繰り上がり方
このとき "a"
の次が なにがくるかというのを知りたいときはsuccを使うとわかる
"a".succ # => "b"
割と自明なものだといいが、複数文字列だとわかりにくいので見ておくと便利。例えば以下。
"aaa".succ # => "aab" "zzz".succ # => "aaaa"
小数点はつかえない
floatはsuccを持っていないのでRangeをつかったeachは設定できない。
10.2.class # => Float 10.2.succ # NoMethodError: undefined method `succ' for 10.2:Float # from (irb):23 # from /usr/bin/irb:11:in `<main>'
10.2..12.each do |val| p val end # NoMethodError: undefined method `each' for 12:Fixnum # from (irb):24 # from /usr/bin/irb:11:in `<main>'