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

26 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
Run Code Online (Sandbox Code Playgroud)

Mar*_*off 9

通过检查文档可以轻松获得此信息.

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.

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