コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

RubyのRangeオブジェクトで次の内容を差配しているのはsucc(next)メソッドの結果

次をどうやって判定しているんだろう、と思ったらこんなメソッドあるんだ的なメモ

環境

$ 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>'

参考サイト