说我有以下课程:
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
那么......定义这样的方法的正确方法是什么?
答案 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,具体取决于您要传递的方法数量。