动态方法命名

时间:2012-04-27 22:54:25

标签: ruby

我希望能够动态命名方法(我不会将其留给用户输入来执行此操作,但作为示例):

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

我该怎么做?

2 个答案:

答案 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_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以类似的方式使用,但在类的实例上定义。 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”,有很多教程。