我需要迭代一个数组,不包括中间的值。我知道我可以做到
(0..10).each do |i|
unless i==6
...
end
end
但我想知道是否有更清洁的方式。我找到的最接近的解决方案是:
Is there an elegant way to exclude the first value of a range?
我需要这样做来迭代我给出的组织不良的数据。
答案 0 :(得分:1)
((0..10).to_a - [6]).each do |i|
...
end
答案 1 :(得分:0)
您可以使用reject
方法来完成它。
我不知道它是否更清洁,但它只是另一种方式。
(0..10).reject { |v| v == 6 }.each do |i|
试一试并告诉我你怎么看待它。 :)
答案 2 :(得分:0)
对于您的简单案例,不确定它是否更清晰或更首选,但您可以执行类似
的操作(0..10).select{|i| i!=6}.each do
# YOUR CODE
end
在更复杂的情况下,这绝对是一种方式
P.S。在写答案时,答案是拒绝一个到达:)这几乎是同一个,我只是忘了拒绝,记得只选择:)
答案 3 :(得分:0)
如果您只想在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
答案 4 :(得分:0)
我想你可以使用像......
之类的东西来定义一个子类或补丁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
答案 5 :(得分:0)
您可以使用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