在运行时在ruby中定义模板中的方法

时间:2011-01-26 21:55:09

标签: ruby metaprogramming

说我有以下课程:

class Foo
  attr_accessor :name, :age
end

class Bar
    def initialize(name)
        @foo = Foo.new
        @foo.name = name
    end
end

我想在Bar上定义一个只是foo.name的别名的访问器。很容易:

def name
  @foo.name
end

def name=(value)
  @foo.name = value
end

只有一个属性,这很容易。但是,假设Foo暴露了我希望通过Bar公开的几个属性。我不想手动定义每个方法,而是想做这样的事情,虽然我知道语法不对:

[:name, :age].each do |method|
  def method
    @foo.method
  end

  def method=(value)
    @foo.method = value
  end
end

那么......定义这样的方法的正确方法是什么?

3 个答案:

答案 0 :(得分:2)

要动态定义方法,可以使用define_method将方法名称作为符号或字符串参数。

要动态调用方法,您可以使用send,它也会将方法名称作为符号或字符串。

[:name, :age].each do |method|
  define_method(method) do
    @foo.send(method)
  end

  define_method("#{method}=") do |value|
    @foo.send("#{method}=", value)
  end
end

答案 1 :(得分:1)

[:name, :age].each do |method|
  define_method(method) do
    foo.send(method)
  end

  define_method("#{method}=") do |value|
    foo.send("#{method}=", value)
  end
end

答案 2 :(得分:1)

请参阅Ruby标准库中的Delegator class,具体取决于您要传递的方法数量。