2011-03-06 39 views
4

假设我在Ruby中有这个循环。ruby​​中是否有each_if?

@list.each { |i| 
    puts i 

    if i > 10 
    break 
    end 
} 

在哪里我要遍历列表,直到满足条件。

这刺痛了我“un Ruby'ish”,既然我是Ruby的新手,有没有Ruby方法可以做到这一点?

回答

6

根据您想要的结果,您可以使用Enumerable#detectEnumerable#take_while

@list.detect { |i| 
    puts i 
    i > 10 
} # Returns the first element greater than 10, or nil. 

正如其他人所指出的,更好的风格是首先让你的子选择,然后就可以采取行动,如:

@list.take_while{ |i| i <= 10 }.each{|i| puts i} 
+0

take_while诀窍,谢谢! – 2011-03-06 18:23:08

+1

也许我太正统了,但使用“take_while”或“detect”会让我觉得有点不自在,这些功能是为了在功能上使用(他们会返回一些东西),并产生一些副作用。也就是说,他们按照OP所要求的做。也许:@ list.take_while {...}。每个。好的,这是mattexx的答案。 – tokland 2011-03-06 18:45:45

+0

@tokland:同意。答复调整相应,谢谢。 – 2011-03-06 19:05:55

3

你可以使用take_while:

@list.take_while { |i| i <= 11 }.each { |i| puts i } 
+1

但这样你会迭代两次。有没有办法将条件传递给'each',然后只在符合条件的元素上执行块? – asymmetric 2011-12-26 17:34:37