我正在尝试使用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
答案 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次。