我try 使用范围和each反向迭代:

(4..0).each do |i|
  puts i
end
==> 4..0

通过0..4次迭代写出数字.在另一个范围内r = 4..0似乎是正常的,r.first == 4r.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篇文章,讲述了为什么既要允许迭代,又要一致地处理反向范围很困难.

Ruby相关问答推荐

如何在 Ruby 中反转数字的字节顺序

是否应该在生产时缩小服务器代码?

你如何称呼 Ruby 中的 &: 运算符?

如何使用 RSpec 忽略或跳过测试方法?

如何从 Ruby 中的线程返回值?

如何在 Ruby 的 RestClient gem 中设置超时?

Ruby访问嵌套函数中的外部变量

osx bash上的树命令

ruby 是否支持 case 语句中的范围?

Ruby:从字节创建一个字符串

如何在 linux (ubuntu) 上更新 ruby​​?

rbenv、rvm 和 chruby 有什么区别?

测试变量是否等于两个值之一

Ruby - time.now UTC

Ruby中的urldecode?

Ruby 是否有像栈、队列、链表、映射或集合这样的容器?

在 Ruby 中解析制表符分隔文件的最佳方法是什么?

严格将字符串转换为整数(或 nil)

我更改存储库 URL 后 Capistrano 部署失败

如何在 Ruby 中实现回调?