4

誰かが次のことが起こる理由についていくつかの洞察を流すことができますか?

irb(main):001:0> r = '1'..'30'
=> "1".."30"
irb(main):002:0> r.each do |i|
irb(main):003:1* puts "#{i} : #{r.include?(i)}"
irb(main):004:1> end
1 : true
2 : true
3 : true
4 : false
5 : false
6 : false
7 : false
8 : false
9 : false
10 : true
...
(snip.. the String-numbers here evaluate to true)
...
29 : true
30 : true
=> "1".."30"

true上記はすべてsだと思います。私が次のことをした場合:

irb(main):005:0> r.to_a.each do |i|
irb(main):006:1* puts "#{i} : #{r.to_a.include?(i)}"
irb(main):007:1> end
1 : true
2 : true
...
(snip.. the String-numbers here evaluate to true)
...
29 : true
30 : true
=> ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "
15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28
", "29", "30"]

それから私は私が期待したものを手に入れます。範囲がどのように機能するかについて何かが欠けていますか、それともこれはバグ(おそらく前者)である可能性がありますか?これが初心者の質問である場合、事前に私の悪い。ハード/ソフト引用符は違いを生じません。同じ問題は、1〜30以外の値の文字列形式の数値の範囲でも発生します。

4

1 に答える 1

9

これは、Rubyで範囲がどのように機能するかという癖です。オブジェクトはを繰り返し呼び出すことによって生成されますがsucc、メンバーシップはによって決定されx >= r.start && x <= r.endます。Rubyの文字列には、番号の順序付けに関する特別な動作はありません。「4」は「1」よりも大きいため、「4」は「10」よりも大きくなります。したがって、終了値の最初の桁よりも大きい1桁の数値は、範囲内にないように見えます。

于 2009-09-03T22:46:15.577 に答える