12
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Ruby 2.6 で 0.step.step は何を返すか

Posted at

ある記事に,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#stepRange#stepEnumerator を返していた。

Ruby 2.6 では Enumerator::ArithmeticSequence というものを返すように変更されるらしい。
変更といっても,これは Enumerator の下位クラス。

arithmetic sequence というと何やら難しい概念のような気がしてしまうが,なんのことはない,等差数列のこと。

確かに,step って等差数列の各項について何かするものだものな。
(正確に言えば,ブロック付きだと実際に何かするし,ブロック無しだと何かするための Enumerator を返す)

0.step は引数が無いので,公差(増分)が 1 の無限数列だよね。

で,Enumerator::ArithmeticSequencestep メソッドは公差を返すので,答えは 1 というわけ。

0.step.step は同じメソッド名が重なってるけど,一つ目の step と二つ目の step は全然違う働きをするわけだ。

「だから何なんだよ。べつにおもしろくねーよ」
「いやだから,最初に言ったようにこの記事は腹いせに投稿したものであってだな」

12
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?