2011-08-16 17 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 

しかし、それはループ(代わりに一つだけの)の約2回の反復を実行し、私の意見では、あなたのコードのように明確ではないだろう。次のように私は想像することができる唯一のマイナーな改良点は次のとおりです。

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

あなたの「メイン」ロジックのインデントの別のレベルを必要としないこの方法です。

+0

を終了し、私は最初のバージョンを好む場合。 – Cydonia7

+0

はい私はあなたの解決策を見てあなたに同意する傾向があります。とにかくソリューションをありがとう、それは完全に動作しますが、私は私の現在のコードに固執する:) –

3

あなたは、そのキー例えば「3」である要素フィルタリングしたい場合:

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

任意の条件で動作します。

0

少しだけ変種:代わりの

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

/各ループはあなたに興味を持っていない項目をスキップしますそうです

関連する問題