我有以下代码:
self.board.each { |position, piece|
if piece == 'test'
...
end
}
我想知道是否有办法过滤我的哈希循环?而不是将If语句放在其中?
我尝试使用'each'方法在散列上使用'Select'方法,但没有运气。
由于
答案 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,每个循环将跳过你不感兴趣的项目。