为什么会(1..5).each迭代1,2,3,4,5,但(5..1)不会?它返回Range.
1.9.2p290 :007 > (1..5).each do |i| puts i end
1
2
3
4
5
=> 1..5
1.9.2p290 :008 > (5..1).each do |i| puts i end
=> 5..1
Run Code Online (Sandbox Code Playgroud)
Der*_*gan 49
最简单的方法是使用downto
5.downto(1) do |i| puts i end
Run Code Online (Sandbox Code Playgroud)
Dav*_*ton 22
范围用于<=>确定迭代是否结束; 5 <=> 1 == 1(大于),所以在它开始之前完成.即使他们没有,范围迭代使用succ; 5.succ是的6,还是运气不好.范围step不能是负数,因此也不起作用.
它返回范围,因为each返回它所调用的内容.使用downto如果它是你正在寻找它本身的功能,否则上述回答关于"为什么"的实际问题.
您可以轻松扩展Range类,尤其是each方法,使其与升序和降序范围兼容:
class Range
def each
if self.first < self.last
self.to_s=~(/\.\.\./) ? last = self.last-1 : last = self.last
self.first.upto(last) { |i| yield i}
else
self.to_s=~(/\.\.\./) ? last = self.last+1 : last = self.last
self.first.downto(last) { |i| yield i }
end
end
end
Run Code Online (Sandbox Code Playgroud)
然后,以下代码将按照您的预期执行:
(0..10).each { |i| puts i}
(0...10).each { |i| puts i}
(10..0).each { |i| puts i}
(10...0).each { |i| puts i}
Run Code Online (Sandbox Code Playgroud)