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_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”,那里有很多教程。

于 2012-04-28T00:03:54.073 回答