使用Range vs. Times在Ruby中循环差异

时间:2010-05-28 03:29:15

标签: ruby loops range

我正在尝试使用Ruby解决Project Euler问题,我使用了4种不同的循环方法,for-loop,times,range和upto方法,但是times方法只产生预期的答案,而for循环,范围和upto方法没有。我假设他们有点相同,但我发现它不是。有人可以解释这些方法之间的差异吗?

这是我使用的循环结构

# for-loop method
for n in 0..1
  puts n
end

0
1
=> 0..1

# times method
2.times do |n|
  puts n
end

0
1
=> 2

# range method
(0..1).each do |n|
  puts n
end

0
1
=> 0..1

# upto method
0.upto(1) do |n|
  puts n
end

0
1
=> 0

2 个答案:

答案 0 :(得分:8)

通过查看文档可以轻松获得此信息。

Array#each的签名为array.each {|item| block } → array,因此我们可以看到foo.each { ... }的返回值为foo

同样,Int#upto的签名为int.upto(limit) {|i| block } => int,因此x.upto(y) { ... }将始终返回x

然后我们还可以看到2.times { ... }Integer#times的签名而返回2。

我无法找到正确的文档,但for x in y...被转换为y.each do |x| ...,这就是为什么你的for-in循环返回与.each循环相同的东西。< / p>

无论如何,取决于 return 这些循环结构的值是......一种奇怪的方法。在惯用的Ruby代码中,我认为这不会发生太多(根本没有?)。

答案 1 :(得分:3)

如果我理解正确,你会问为什么n.times是唯一可以迭代的方法,但不包括n。在那种情况下:

对于范围,它很简单:x..y定义从x到y的范围,x...y定义从x到y的范围。因此,如果您希望使用相同的行为,请使用0...n

对于x.upto(y),只有一个版本会迭代到y。这就是如何定义和记录工作原理。

同样很清楚为什么n.times不包括n:如果它从0迭代到n(包括),它将产生n+1次。但由于该方法被称为n.times,因此它应该只能产生n次。