Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby使用范围与时间的循环差异_Ruby_Loops_Range - Fatal编程技术网

Ruby使用范围与时间的循环差异

Ruby使用范围与时间的循环差异,ruby,loops,range,Ruby,Loops,Range,我正在尝试使用Ruby解决一个项目Euler问题,我使用了4种不同的循环方法,for循环、times、range和upto方法,但是times方法只产生预期的答案,而for循环、range和upto方法则没有。我假设它们有些相同,但我发现事实并非如此。有人能解释一下这些方法的区别吗 这是我使用的循环结构 # for-loop method for n in 0..1 puts n end 0 1 => 0..1 # times method 2.times do |n| put

我正在尝试使用Ruby解决一个项目Euler问题,我使用了4种不同的循环方法,for循环、times、range和upto方法,但是times方法只产生预期的答案,而for循环、range和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

通过检查文档可以很容易地获得此信息

具有
array.each{| item | block}的签名→ 数组
,因此我们可以看到
foo.each{…}
的返回值是
foo

同样,具有
int.upto(limit){i | block}=>int
,因此
x.upto(y){…}
将始终返回
x

然后我们还可以看到,由于的签名,
2.times{…}
将返回2

我很难找到正确的文档,但是
for x in y...
被转换为
y.each do | x |...
,这就是为什么for in循环返回与
相同的内容。each
循环


无论如何,根据这些循环构造的返回值是。。。一种奇怪的方法。我认为这在惯用的Ruby代码中不会发生太多(完全?)。

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

对于范围,它很简单:
x..y
定义了从x到y的范围(包括x到y),而
x..y
定义了从x到y的范围(不包括x到y)。因此,如果您想要与时间相同的行为,请使用
0…n

对于
x.upto(y)
只有一个版本将迭代到并包括
y
。这就是如何定义和记录upto的工作方式


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

我觉得他并不是在问返回值。@sepp2k:我看到每个语句的输出是
01
,而
=>
指示的返回值有3个不同的值。无论如何,这个问题本来可以说得更清楚。我认为OP误解了IRB输出的
=>
,认为这是循环编码输出的正常部分。