我正在编写一个新的访问器,它有自己的数组变量来保存信息但是当我尝试在其方法中调用class_eval时,该变量的push方法不起作用。
它是一个用Class编写的方法,class_eval行的内容如下:
class_eval "def #{attr_name}=(value); #{attr_name} = value; #{information}.push value; end; def #{attr_name}_history; #{information}; end"
所以推动这一行不起作用。
答案 0 :(得分:0)
当你调用information
时,你必须确保局部变量class_eval
存储的任何字符串实际上是你在该类中添加此函数的方法。< / p>
以下是有效的,因为我确保该类具有history
方法。
class A
def history
@history ||= []
end
end
attr_name = "foo"
information = "history"
A.class_eval "def #{attr_name}=(value); #{attr_name} = value; #{information}.push value; end; def #{attr_name}_history; #{information}; end"
a = A.new
a.foo = "bar"
a.foo = "baz"
a.foo_history
答案 1 :(得分:0)
它不起作用,因为“#{information}”将返回information
的字符串值,而不是实际的Array对象本身。这是因为它在构建时替换了字符串。
您必须将其更改为一个变量,该变量既是您正在使用的对象范围的一部分,也是您正在处理的类的一部分。例如,尝试将其更改为:
Foo::Information = [...]
class_eval "
class_eval "
def #{attr_name}=(value)
#{attr_name} = value
Foo::Information.push value
end
def #{attr_name}_history
Foo::Information
end"
"
答案 2 :(得分:0)
这是因为information
变量应该初始化为数组,然后你可以在其上调用push
方法。像这样:
def #{attr_name}=(value);
#{attr_name} = value;
(#{information}||=[]).push value;
end;
def #{attr_name}_history;
#{information};
end
顺便说一句,你的结构很难看,所以下次你必须三思而后行。