メソッドに動的に名前を付けられるようにしたい(これを行うのはユーザー入力に任せないが、例として):
puts ""
foo = gets
def (whatever the user inputted for foo)
end
これどうやってするの?
メソッドに動的に名前を付けられるようにしたい(これを行うのはユーザー入力に任せないが、例として):
puts ""
foo = gets
def (whatever the user inputted for foo)
end
これどうやってするの?
これは、send
メソッドを使用してクラスにメッセージを送信し、パラメーター:define_method
を使用して、そのクラスの新しいメソッドを定義することを通知することで実行できます。
たとえば、クラスを持つCar
class Car
end
c = Car.new
c.sound
エラーを引き起こすための呼び出し
NoMethodError: undefined method `sound' for #<Car:0x29d9048>
ただし、メソッドの名前を定義してクラスに送信した後は、次のようになります。
input = "sound"
Car.send(:define_method, input) do
puts "vroom!"
end
を呼び出すとc.sound
、出力が表示されます
vroom!
最も一般的に使用されるアプローチは次のとおりです。 define_method
、、class_eval
およびinstance_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
同様の方法で使用されますが、クラスのインスタンスで定義されます。
define_method
同様です:
#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!
「RubyMetaprogramming」を検索すると、そこに多くのチュートリアルがあります。