有没有办法迭代一个范围,排除一个值

时间:2013-02-07 01:15:27

标签: ruby

我需要迭代一个数组,不包括中间的值。我知道我可以做到

 (0..10).each do |i|
     unless i==6
         ...
     end
  end

但我想知道是否有更清洁的方式。我找到的最接近的解决方案是:

Is there an elegant way to exclude the first value of a range?

我需要这样做来迭代我给出的组织不良的数据。

6 个答案:

答案 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