无法推入ruby阵列

时间:2012-03-03 20:41:19

标签: ruby arrays push

我正在编写一个新的访问器,它有自己的数组变量来保存信息但是当我尝试在其方法中调用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"

所以推动这一行不起作用。

3 个答案:

答案 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
顺便说一句,你的结构很难看,所以下次你必须三思而后行。