ある記事に,30 分以上かけて長大なコメントを書いてたら,なんか操作を誤って画面遷移(前画面に戻る)してしまい,すぐに元に戻したのにコメント投稿欄が空になってしまい,どうやっても取り戻せなかった(どういう作り方をしたらこうなるんだ?)。
腹いせにくだらない記事を投稿することにした。
問題
Ruby 2.5 では,
0.step.step
は NoMethodError になる。
Ruby 2.6 だとどうなるか?
なお,CentOS 7 で rbenv を使ってインストールした Ruby 2.6.0-preview3 だと期待どおりの動作だったが,macOS の rbenv でインストールした 2.6.0-preview3 だと,なぜか Ruby 2.5 と同じ結果(NoMethodError)になった
そんなことってあるの???
答え:1
Ruby 2.5 では Numeric#step
や Range#step
は Enumerator
を返していた。
Ruby 2.6 では Enumerator::ArithmeticSequence
というものを返すように変更されるらしい。
変更といっても,これは Enumerator
の下位クラス。
arithmetic sequence というと何やら難しい概念のような気がしてしまうが,なんのことはない,等差数列のこと。
確かに,step
って等差数列の各項について何かするものだものな。
(正確に言えば,ブロック付きだと実際に何かするし,ブロック無しだと何かするための Enumerator
を返す)
0.step
は引数が無いので,公差(増分)が 1 の無限数列だよね。
で,Enumerator::ArithmeticSequence
の step
メソッドは公差を返すので,答えは 1 というわけ。
0.step.step
は同じメソッド名が重なってるけど,一つ目の step
と二つ目の step
は全然違う働きをするわけだ。
「だから何なんだよ。べつにおもしろくねーよ」
「いやだから,最初に言ったようにこの記事は腹いせに投稿したものであってだな」