1

この不自然な例を考えてみましょう:

# Dispatch on value of fruit_kind:

TYPE_A = :apple
TYPE_B = :banana
TYPE_C = :cherry

eating_method = nil

case fruit_kind
  # Methods to use for different kinds of fruit (assume these are
  #  already defined)
  when TYPE_A then eating_method = bite
  when TYPE_B then eating_method = peel
  when TYPE_C then eating_method = om_nom_nom
end

eating_methodここで、いくつかの引数を指定して のターゲットを呼び出したいと思います:

# Doesn't work; this tries to invoke a method called "eating_method",
# not the reference I defined earlier.
eating_method(some_fruit)

Rubyでこれを行う正しい方法は何ですか?

4

4 に答える 4

6

を使用しsendます。Send は関数名を使用するため、記号を使用します。

case fruit_kind
  # Methods to use for different kinds of fruit (assume these are
  #  already defined)
  when TYPE_A then eating_method = :bite
  when TYPE_B then eating_method = :peel
  when TYPE_C then eating_method = :om_nom_nom
end

send(eating_method, some_fruit)

編集:

caseところで、次のようにすれば、もう少しきれいにできることをご存知でしたか?

eating_method = case fruit_kind
  # Methods to use for different kinds of fruit (assume these are
  #  already defined)
  when TYPE_A then :bite
  when TYPE_B then :peel
  when TYPE_C then :om_nom_nom
  else nil
end

または、Sii が言及しているように、代わりにハッシュを使用します。

fruit_methods = {:apple => :bite, :banana => :peel, :cherry => :om_nom_nom}
send(fruit_methods[fruit_kind], some_fruit)    
于 2009-04-30T14:03:07.473 に答える
0

言葉遣いは私を大いに混乱させます。

ただし、おそらくObject#sendが必要です。

于 2009-04-30T14:03:43.073 に答える
0

Object#sendRuby オブジェクト モデルでは、呼び出したいメソッドとしてシンボルを取るメソッドを使用して、メソッドを動的に呼び出すことができます。

したがって、FruitEater というクラスがあれば、食べるメソッドを次のように送信できます。


f = FruitEater.new

# Dispatch on value of fruit_kind:

TYPE_A = :apple
TYPE_B = :banana
TYPE_C = :cherry

eating_method = nil

case fruit_kind
  # Methods to use for different kinds of fruit (assume these are
  #  already defined)
  when TYPE_A then eating_method = :bite
  when TYPE_B then eating_method = :peel
  when TYPE_C then eating_method = :om_nom_nom
end

f.send(eating_method)
于 2009-04-30T14:38:59.867 に答える