我需要遍历一个数组,不包括中间的一个值。我知道我能做到
(0..10).each do |i|
unless i==6
...
end
end
但我想知道是否有更清洁的方法。我找到的最接近的解决方案是:
我需要这样做来遍历给我的组织不善的数据。
我需要遍历一个数组,不包括中间的一个值。我知道我能做到
(0..10).each do |i|
unless i==6
...
end
end
但我想知道是否有更清洁的方法。我找到的最接近的解决方案是:
我需要这样做来遍历给我的组织不善的数据。
((0..10).to_a - [6]).each do |i|
...
end
您可以使用reject
方法来完成它。
我不知道这是否是一种更清洁的方式,但这只是另一种方式。
(0..10).reject { |v| v == 6 }.each do |i|
试一试,告诉我你对此有何看法。:)
对于您的简单案例,不确定它是否更清洁或首选方式,但您可以执行类似的操作
(0..10).select{|i| i!=6}.each do
# YOUR CODE
end
在更复杂的情况下,这绝对是一种方法
PS在写答案的时候,有reject的答案到了:)这几乎是一样的,我只是忘了reject,只记得select:)
next
如果您只想绕过将代码包装在一个unless
块中,您可以使用它。例如,如果您想跳过一组数字,您可以执行以下操作:
skip_values = [3, 6, 7]
(0..10).each do |i|
# When i is 3, 6, or 7, continue to the next iteration
next if skip_values.include?(i)
...
end
我想你可以用类似的东西定义一个子类或补丁 Range 本身......
def reach not_this_one
each do |x|
yield x unless x == not_this_one
end
end
...也许...
def reach not_this_one, &block
self.select { |x| x != not_this_one }.each &block
end
您可以通过使用暂时排除一个值Enumerable#grep_v
:
(1..5).grep_v(2).each { |n| puts n }
#1
#3
#4
#5
不幸的是grep_v
,就像其他一些发布的答案一样,创建了一个中间数组。老实说,我更喜欢你最初的方法,它可以写得更整洁(没有猴子补丁):
(1..5).each { |n| puts n unless n == 2 }
#1
#3
#4
#5