OPは書いた
上記の構成が期待した結果を生成しないのは私には奇妙に思われます。その理由は何ですか?この動作が合理的である状況は何ですか?
できますか?しかし、実際に尋ねられた質問に到達する前に、尋ねられなかった質問に答えるには:
$ irb
2.1.5 :001 > (0..4)
=> 0..4
2.1.5 :002 > (0..4).each { |i| puts i }
0
1
2
3
4
=> 0..4
2.1.5 :003 > (4..0).each { |i| puts i }
=> 4..0
2.1.5 :007 > (0..4).reverse_each { |i| puts i }
4
3
2
1
0
=> 0..4
2.1.5 :009 > 4.downto(0).each { |i| puts i }
4
3
2
1
0
=> 4
reverse_eachは配列全体を構築すると主張されているため、downtoの方が明らかに効率的です。言語デザイナーがそのようなものを実装することを検討することさえできるという事実は、尋ねられた実際の質問への答えと結びついています。
実際に尋ねられた質問に答えるには...
その理由は、Rubyが際限なく驚くべき言語だからです。いくつかの驚きは楽しいですが、まったく壊れている行動がたくさんあります。以下の例の一部が新しいリリースで修正されたとしても、他の例はたくさんあり、それらは元の設計の考え方に対する指針として残っています。
nil.to_s
.to_s
.inspect
結果は「」ですが
nil.to_s
# .to_s # Don't want this one for now
.inspect
結果は
syntax error, unexpected '.', expecting end-of-input
.inspect
^
おそらく、<<とpushは配列への追加と同じであると期待しますが、
a = []
a << *[:A, :B] # is illegal but
a.push *[:A, :B] # isn't.
'grep'はUnixコマンドラインと同じように動作するはずですが、名前に関係なく===一致せず=〜は一致しません。
$ echo foo | grep .
foo
$ ruby -le 'p ["foo"].grep(".")'
[]
さまざまなメソッドは予想外に互いにエイリアスであるため、たとえばfind
、detect
ほとんどの開発者が好きで、どちらか一方しか使用しない場合でも、同じものに対して複数の名前を学習する必要があります。多くの同じはのために行くsize
、count
とlength
それぞれ異なるを定義する、またはすべてで1または2を定義していないクラスを除き、。
誰かが何か他のものを実装していない限り-コアメソッドのtap
ように、画面上で何かを押すためにさまざまなオートメーションライブラリで再定義されています。特に他のモジュールが必要とするいくつかのモジュールが、文書化されていない何かをするためにさらに別のモジュールを呼び出している場合は特に、何が起こっているかを見つけるのに頑張ってください。
環境変数オブジェクトであるENVは「マージ」をサポートしていないため、次のように記述する必要があります。
ENV.to_h.merge('a': '1')
おまけとして、自分や他の人の定数を再定義することもできます。