任何人都可以了解为什么会发生以下情况?
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之间的值,字符串形式的数字范围也会出现同样的问题.
这是范围如何在Ruby中工作的怪癖.通过重复调用生成对象succ
,但成员资格由确定x >= r.start && x <= r.end
.Ruby中的字符串对于排序数字没有特殊行为 - "4"大于"10",因为"4"大于"1".因此,任何高于结束值第一个数字的单位数字都不会出现在范围内.