2011-08-16 22 views
3

我有下面的代碼過濾:循環執行的Ruby散列,並使用各種方法

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

我想知道如果有一種方法來過濾什麼我散列循環結束了嗎?而不是將If語句放在裏面?

我試着用'each'方法對散列上的'選擇'方法,但沒有運氣。

感謝

回答

18

你的代碼是慣用的;我看不出有什麼辦法來改善它的表現或清晰度。你可以使用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 

這樣,你不需要爲你的「主」邏輯縮進的另一個層次。

+0

這是正確的,我喜歡的第一個版本。 – Cydonia7

+0

是的,我在看完你的解決方案之後傾向於同意你的看法。無論如何,感謝解決方案,它完美的作品,但我會堅持我目前的代碼:) –

3

如果要過濾掉,其關鍵是「三」爲實例的元素:

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

與任何條件下工作。

0

只有一點點的變體:

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

相反的如果/結束的每個環將跳過你不感興趣的項目