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"

我希望以上都是trues。如果我执行以下操作:

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”大于“10”,因为“4”大于“1”。因此,任何高于最终值第一个数字的个位数数字都不会出现在范围内。

于 2009-09-03T22:46:15.577 回答