我希望能够动态命名方法(我不会将其留给用户输入来执行此操作,但作为示例):
puts ""
foo = gets
def (whatever the user inputted for foo)
end
我该怎么做?
答案 0 :(得分: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!
答案 1 :(得分: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!
搜索“Ruby Metaprogramming”,有很多教程。