2

メソッドに動的に名前を付けられるようにしたい(これを行うのはユーザー入力に任せないが、例として):

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

これどうやってするの?

4

2 に答える 2

3

これは、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!
于 2012-04-27T23:27:13.813 に答える
0

最も一般的に使用されるアプローチは次のとおりです。 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」を検索すると、そこに多くのチュートリアルがあります。

于 2012-04-28T00:03:54.073 に答える