ここに 2 つの範囲値があります。
('1'..'10').to_a => ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]
しかし、
('2'..'10').to_a => []
Ruby 1.8.7 で 2 番目が空の配列を返すのはなぜですか?
問題は、Ruby 1.8 が('2'..'10')
コードの分析の一環として有効な範囲であるかどうかを判断しようとしており、無効であると判断していることです。範囲値を逆にして'2'
ソートします。'10'
これは、人々が文字列値を並べ替えようとするときによくある問題であり、そのトリックが機能しないことを知るまで、何度も何度も遭遇します。
1.8.7 を使用:
('2'..'10').to_a
=> []
('02'..'10').to_a
=> ["02", "03", "04", "05", "06", "07", "08", "09", "10"]
または:
(2..10).map(&:to_s)
=> ["2", "3", "4", "5", "6", "7", "8", "9", "10"]
1.8 および 1.9+ Ruby との互換性が必要な場合は、おそらく最後の方法を使用します。
irb(main):001:0> '2' > '10'
=> true
irb(main):002:0> '1'>'10'
=> false
文字列比較アルゴリズムのため、上限よりも大きい下限で範囲を作成することはできません。
実際には1.9.3で動作します。変。
それは私が得ているものではありません:
irb(main):001:0> ('2'..'10').to_a
=> ["2", "3", "4", "5", "6", "7", "8", "9", "10"]
質問とは関係ありませんが、正しい方法は次のとおりです。
(2..10).to_a
(私は Ruby 1.9.3 を使用しています)
ruby2.0.0-p-0 でこれは私が得ているものです:
["2", "3", "4", "5", "6", "7", "8", "9", "10"]