• ベストアンサー

【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 上記例では冗長の思うのですが、ご指導のほど宜しくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • ryu_chan
  • ベストアンサー率37% (69/186)
回答No.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 } )

kingfruits
質問者

お礼

ryu_chanさん、ご回答有難うございました。 rubyの事だから、きっと良い方法があるのだろうと、うすうす感じてましたが、こんな素晴らしい方法があるんですね!! 勉強になりました。

関連するQ&A