Ruby使用范围与时间的循环差异
我正在尝试使用Ruby解决一个项目Euler问题,我使用了4种不同的循环方法,for循环、times、range和upto方法,但是times方法只产生预期的答案,而for循环、range和upto方法则没有。我假设它们有些相同,但我发现事实并非如此。有人能解释一下这些方法的区别吗 这是我使用的循环结构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
# 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输出的=>
,认为这是循环编码输出的正常部分。