【问题标题】:Why does "each"-ing a range only work with incrementing ranges? [duplicate]为什么“每个”范围仅适用于递增范围? [复制]
【发布时间】:2014-08-12 15:02:05
【问题描述】:

这完全没有意义:

irb(main):001:0> (1..10).each do |x|
irb(main):002:1*   puts x
irb(main):003:1> end
1
2
3
4
5
6
7
8
9
10
=> 1..10

而:

irb(main):004:0> (10..1).each do |x|
irb(main):005:1*   puts x
irb(main):006:1> end
=> 10..1

如果您不能混合和匹配两者,那么提供范围迭代器和对递减范围的支持有什么意义?这是在较新版本的 ruby​​ 中修复的吗? (运行窗口)

【问题讨论】:

  • 见@DaveNewton 的解释here
  • 谢谢,我已将此问题标记为重复问题。
  • 在一张纸上画一条 20.5cm 长的线。每 0.5 厘米标记一次。标记从 -20 到 +20 的标记。将您的手指放在标记为10 的那个上。右侧有多少个小于1 的标记?没有任何!从 10 到 1 的范围为空。数学就是这样,直觉上就是这样,Ruby 也是这样。或者,如果您不喜欢与数学进行比较,那么只需查看 Ruby 中Range 协议的定义:基本上Range#each 表示i = left; while i <= right do i = i.succ; yield i end。现在想想while 循环运行的频率。
  • 在数学中,集合的范围是最大和最小成员之间的差。

标签: ruby range ruby-2.0


【解决方案1】:

事实证明不支持递减范围。确实10..1 属于类范围,但对其进行迭代不会产生任何结果(考虑(10..1).to_a,一个空列表)

【讨论】:

  • 如果你确实想达到你希望范围能做到的事情,你可以这样做10.downto(1).each { |x| puts x }
  • 我刚改成(1..10).to_a.reverse.each - .downto() 是口语偏好吗?
  • 两者都达到了相同的目的,但我个人认为downto版本更清楚地说明了它的目的。
  • 你的解释不充分。你说的是笼统的。您需要更深入地了解each 在发送到r 的范围时会做什么,r.first > r.last (请参考我对您问题的评论)。
【解决方案2】:

Ruby 中的范围仅用于递增值。这可以用于数字

(1..5).to_a
[1,2,3,4,5]

甚至是字母

('a'..'e').to_a
['a','b','c','d','e']

不过,您还可以尝试其他选项。你可以这样做

10.downto(1).to_a

在 Ruby 中,范围使用 运算符来确定迭代是否结束;

5 <=> 1 == 1
5 is greater than 1

下一个值是 4,它不大于 5,而是小于 5。

更新:添加说明

【讨论】:

  • 您还没有回答问题。 (5..1).class =&gt; Range。代码猴子想知道为什么该范围以它的方式响应each
  • 好的,我看看能不能解决问题
猜你喜欢
  • 1970-01-01
  • 2016-04-16
  • 2017-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多