Ruby中“each”循环的动态更改

3

我是一名Ruby的新手,我在使用“each”循环时遇到了问题。假设代码如下:

startIndex = 1
endIndex = 200

(startIndex..endIndex).each do |value|
   p value
   if value>150 then endIndex=100
end

当我运行代码时,它会一直运行到200,而不是150。有没有办法在Ruby中动态更改循环范围的限制?

提前感谢您的帮助。

Tryskele

5个回答

8
为什么不直接使用 break
(startIndex..endIndex).each do |value|
    p value
    break if value>=150
end

因为动态更改循环限制是一种非常糟糕的做法。

3
startIndex= 1
endIndex= 200

range= (startIndex .. endIndex) # => 1..200

endIndex= 150
range # => 1..200

(a..b) 创建一个Range类对象。Range对象不会持有你传递的变量的指针,而是持有指向变量所指向对象的引用。如果你改变变量,使其持有对另一个对象的引用,那么Range仍然持有对旧对象的引用。因此,通过改变对象本身来改变Range是可行的,但是一旦创建了整数对象,就无法更改它。

a= "abc"
b= "def"
range= (a..b) # => "abc".."def"
b.sub!("e", "$")
range # => "abc".."d$f"

如果你想要做的唯一一件事就是从循环中跳出,那么你可以直接使用break

(a..b).each do |v|
  break if something
end

2

不,你尝试的方法行不通。然而,这也是完全不必要的,因为有一种更好的、惯用的方式可以做到你尝试做的完全相同的事情:

p *(1..150)

0
如果你只想在150处停止打印,这些可能会起作用。
startIndex = 1
endIndex = 200

(startIndex..endIndex).each do |value|
   p value if value <= 150
end

或者

startIndex = 1
endIndex = 200

(startIndex..endIndex).each do |value|
   p value
   if value >= 150 
     break
   end
end

0

不。

这几乎肯定不是你想做的事情。

你想要解决什么问题?


hobodave,你说得对,这只是一个例子。事实上,我正在解析一个被分成不同页面(即URI)的Web服务器的回复。只有在解析第一页后,我才能知道页面的数量。这就是为什么我需要动态更改循环的结束范围。我试图弄清楚如何使用“each”类似的循环来做到这一点。还有其他方法吗?感谢大家的回复!Tryskele - mgfernan
如果您始终在第一次初始请求后知道页面数量,那么您可以执行以下操作:(get_number_of_pages).each { |page| ... }其中get_number_of_pages是一个块或另一个函数,它会给您要查看的页面列表。如果可能的话,它甚至可以返回其他页面的URI。这将使您的代码更加明显。 - Priit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接