0

我需要遍历一个数组,不包括中间的一个值。我知道我能做到

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

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

有没有一种优雅的方法来排除范围的第一个值?

我需要这样做来遍历给我的组织不善的数据。

4

6 回答 6

1
((0..10).to_a - [6]).each do |i|
  ...
end
于 2013-02-07T01:55:53.590 回答
0

您可以使用reject方法来完成它。

我不知道这是否是一种更清洁的方式,但这只是另一种方式。

(0..10).reject { |v| v == 6 }.each do |i|

试一试,告诉我你对此有何看法。:)

于 2013-02-07T01:23:18.500 回答
0

对于您的简单案例,不确定它是否更清洁或首选方式,但您可以执行类似的操作

(0..10).select{|i| i!=6}.each do
  # YOUR CODE
end

在更复杂的情况下,这绝对是一种方法

PS在写答案的时候,有reject的答案到了:)这几乎是一样的,我只是忘了reject,只记得select:)

于 2013-02-07T01:25:46.707 回答
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
于 2013-02-07T01:26:04.737 回答
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
于 2013-02-07T01:36:50.667 回答
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
于 2018-04-07T14:05:17.393 回答