我希望能够动态命名方法(我不会让用户输入来做到这一点,但作为一个例子):
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!
搜索“Ruby Metaprogramming”,那里有很多教程。