循环使用Ruby散列并使用每种方法进行过滤

时间:2011-08-16 21:37:49

标签: ruby

我有以下代码:

self.board.each { |position, piece| 
    if piece == 'test'
      ...
    end
}

我想知道是否有办法过滤我的哈希循环?而不是将If语句放在其中?

我尝试使用'each'方法在散列上使用'Select'方法,但没有运气。

由于

3 个答案:

答案 0 :(得分:22)

您的代码是惯用的;我认为没有任何方法可以改善其性能或清晰度。您可以使用select作为“预过滤器”,如下所示:

self.board.select{|a,b|b=='test'}.each do |position,piece|
  # Now you are only looking at "test" pieces...
end

但是在我看来,它会执行大约两次循环迭代(而不仅仅是一次)并且不像你的代码那么清晰。我能想象的唯一一个小改进如下:

self.board.each do |position,piece|
  next unless piece == 'test'
  # ...
end

这样,您的“主”逻辑就不需要另一级别的缩进。

答案 1 :(得分:4)

如果要过滤出键为“3”的元素,例如:

hash.reject {|key ,value| key == "three" }.each{...}

适用于任何条件。

答案 2 :(得分:0)

只有一点变体:

self.board.each { |position, piece| 
  next unless piece == 1
  puts position
}

而不是if / end,每个循环将跳过你不感兴趣的项目。