我try 使用范围和each
反向迭代:
(4..0).each do |i|
puts i
end
==> 4..0
通过0..4
次迭代写出数字.在另一个范围内r = 4..0
似乎是正常的,r.first == 4
,r.last == 0
.
我觉得奇怪的是,上面的构造并没有产生预期的结果.原因是什么?这种行为合理的情况是什么?
我try 使用范围和each
反向迭代:
(4..0).each do |i|
puts i
end
==> 4..0
通过0..4
次迭代写出数字.在另一个范围内r = 4..0
似乎是正常的,r.first == 4
,r.last == 0
.
我觉得奇怪的是,上面的构造并没有产生预期的结果.原因是什么?这种行为合理的情况是什么?
范围就是这样的:由它的开始和结束定义的东西,而不是它的内容.在一般情况下,在一个范围内"迭代"是没有意义的.例如,考虑如何在两个日期产生的范围内"迭代".你会逐日重复吗?按月?到了一年?每周?它没有明确的定义.IMO只允许将其视为一种方便的方法.
如果要在这样的范围内反向迭代,可以始终使用downto
:
$ r = 10..6
=> 10..6
$ (r.first).downto(r.last).each { |i| puts i }
10
9
8
7
6
下面是其他人的some more thoughts篇文章,讲述了为什么既要允许迭代,又要一致地处理反向范围很困难.