2012-04-27 6 views
2

命名私は動的に名前のメソッド(私はこれを行うには、ユーザの入力にそれを任せるが、一例としてではないでしょう)にできるようにしたい:動的メソッドは

puts "" 
foo = gets 
def (whatever the user inputted for foo) 
end 

はどうすればこれを行うことができますか?

答えて

3

sendメソッドを使用して、このクラスにメッセージを送信し、パラメータ:define_methodを使用して、そのクラスに新しいメソッドを定義することを通知できます。

c.soundの呼び出しがエラー

NoMethodError: undefined method `sound' for #<Car:0x29d9048> 

しかし、メソッドの名前を定義し、クラスにそれを送信した後もたらすクラスにCar

class Car 
end 

c = Car.new 

を持つ例えば

input = "sound" 

Car.send(:define_method, input) do 
    puts "vroom!" 
end 

c.soundへの呼び出し今出力

vroom! 
0

をもたらす最も一般的に使用されるアプローチは、以下のとおりです。define_methodclass_evalinstance_eval。定義するmethod_missingメソッドも多く使用されます。

#An example of class_eval 
class Foo 
end 

foo = gets.chomp 
#suppose you input bar here 
Foo.class_eval %Q{ 
    def #{foo} 
    puts "This is #{foo} method you defined!" 
    end 
} 
Foo.new.bar 
#output: This is the bar method you defined! 

instance_evalは、同様の方法で使用されますが、クラスのインスタンスで定義されます。

#An example of define_method 
klass = Class.new 
foo = gets.chomp 
#suppose you typed bar 
klass.send(:define_method,foo) do 
    puts "This is #{foo} method you defined!" 
end 
klass.new.bar 
#output: This is bar method you defined! 

検索「ルビーメタプログラミング」と多くのチュートリアルはそこにあります define_methodも同様です。

関連する問題