こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

【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

上記例では冗長の思うのですが、ご指導のほど宜しくお願いいたします。

投稿日時 - 2009-09-10 23:39:51

QNo.5279730

暇なときに回答ください

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

以下のように、ブロックを一旦、変数に格納すればすっきりすると思います。

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 } )

投稿日時 - 2009-09-11 11:08:01

お礼

ryu_chanさん、ご回答有難うございました。

rubyの事だから、きっと良い方法があるのだろうと、うすうす感じてましたが、こんな素晴らしい方法があるんですね!!

勉強になりました。

投稿日時 - 2009-09-11 14:33:53

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問