2009-09-03 7 views
4

誰でも次のようなことが起こる理由を知ることができますか?Rubyの範囲が予期しない動作

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以外の値で発生します。

答えて

9

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

+0

意味があります。ありがとう – maksim

関連する問題