- ベストアンサー
【ruby】二つのブロック付きメソッドをif文で使い分けたい
二つのブロック付きメソッドhogeとpiyoがあるとします。 ブロックの中に記述するプログラムは同じだが、hogeを使うか、piyoを使うかは条件により制御したいです。 このような場合、どのように書いたら簡素になるでしょうか? sw=true if sw then hoge() do |x| puts x done else piyo() do |x| puts x done end 上記例では冗長の思うのですが、ご指導のほど宜しくお願いいたします。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
以下のように、ブロックを一旦、変数に格納すればすっきりすると思います。 block = proc {|x| puts x } if sw hoge &block else piyo &block end __send__(あるいはsend)を使うと1行で書けます。 __send__( sw ? 'hoge' : 'piyo', &proc {|x| puts x } ) メソッドがたくさんある場合は以下のようにすることもできます。 sw = 2 __send__( %w(hoge fuga piyo foo bar baz)[sw], &proc {|x| puts x } )
お礼
ryu_chanさん、ご回答有難うございました。 rubyの事だから、きっと良い方法があるのだろうと、うすうす感じてましたが、こんな素晴らしい方法があるんですね!! 勉強になりました。