2013-06-26 5 views
6

は、これは奇妙な音に起こっているが、私はこのような何かをするのが大好きだ:ハッシュのRuby case文?

case cool_hash 
    when cool_hash[:target] == "bullseye" then do_something_awesome 
    when cool_hash[:target] == "2 pointer" then do_something_less_awesome 
    when cool_hash[:crazy_option] == true then unleash_the_crazy_stuff 
    else raise "Hell" 
end 

理想的には、私もそれがcase文が何であるかだからインクルードが再び持って参照する必要はありません。もし私がただ一つのオプションを使いたいと思ったら、 "cool_hash [:that_option]"のようなケースですが、いくつでもオプションを使いたいと思います。また、私はRubyのcase文が最初のtrue条件ブロックだけを評価することを知っていますが、ブレークがなければ真であるすべてのブロックを評価するためにこれをオーバーライドする方法はありますか?

答えて

3

あなたのコードは、有効なルビコードに非常に近いです。

case 

しかし、複数のブロックを評価するためのcase文をオーバーライドする方法はありません。私はあなたが望むものはifステートメントを使用することだと思います。 breakの代わりに、returnを使用してメソッドから飛び出します。

def do_stuff(cool_hash) 
    did_stuff = false 

    if cool_hash[:target] == "bullseye" 
    do_something_awesome 
    did_stuff = true 
    end 

    if cool_hash[:target] == "2 pointer" 
    do_something_less_awesome 
    return # for example 
    end 

    if cool_hash[:crazy_option] == true 
    unleash_the_crazy_stuff 
    did_stuff = true 
    end 

    raise "hell" unless did_stuff 
end 
+0

おかげでたくさん!大変感謝しています。これは時間の経過とともに私がRubyで思うように役立ちます。 –

4

私が思うに、以下はあなたが望むものを行う良い方法です。代わりに、より多くの条件がある場合は、「もし」は:

def do_awesome_stuff(cool_hash) 
    case cool_hash[:target] 
    when "bullseye" 
     do_something_awesome 
    when "2 pointer" 
     do_something_less_awesome 
    else 
    if cool_hash[:crazy_option] 
     unleash_the_crazy_stuff 
    else 
     raise "Hell" 
    end 
    end 
end 

場合でも、他の部分では、あなたは「[crazy_option]ケースcool_hashの」を使用することができます。この場合、条件が1つしかないので、「if」を使用することをお勧めします。

12

また、ラムダを使用することができます:高速応答のための

case cool_hash 
when -> (h) { h[:key] == 'something' } 
    puts 'something' 
else 
    puts 'something else' 
end 
+0

私が探していたもの! – Yonk