1

ここに 2 つの範囲値があります。

('1'..'10').to_a   => ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]

しかし、

('2'..'10').to_a  => []

Ruby 1.8.7 で 2 番目が空の配列を返すのはなぜですか?

4

4 に答える 4

5

問題は、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 との互換性が必要な場合は、おそらく最後の方法を使用します。

于 2013-03-27T15:04:50.860 に答える
4
irb(main):001:0> '2' > '10'
=> true
irb(main):002:0> '1'>'10'
=> false

文字列比較アルゴリズムのため、上限よりも大きい下限で範囲を作成することはできません。

実際には1.9.3で動作します。変。

于 2013-03-27T12:31:09.233 に答える
2

それは私が得ているものではありません:

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 を使用しています)

于 2013-03-27T12:31:27.563 に答える
1

ruby2.0.0-p-0 でこれは私が得ているものです:

["2", "3", "4", "5", "6", "7", "8", "9", "10"]
于 2013-03-27T12:45:42.953 に答える