为什么 `instance_eval`/`class_eval` 无法访问 class 变量?

Why is `instance_eval`/`class_eval` not able to access class variables?

class MySelf
  @@name = 'jonathan'
  def self.name
    @@name
  end
end

MySelf.instance_eval {@@name}
MySelf.class_eval {@@name}

同时抛出:

NameError: uninitialized class variable @@collection in Object

但是

MySelf.instance_eval {name}
MySelf.class_eval {name}

两者都有效。

如何使用 instance_eval/class_eval 访问静态变量 @@name,或者如何从 class 外部赋值?

我认为你必须使用 class 实例变量.

class MySelf
  @name = 'jonathan'

  def self.name
    @name
  end
end

MySelf.instance_eval { @name } # => "jonathan"
MySelf.class_eval { @name }    # => "jonathan"

请尝试一下。

抛出的错误是因为MySelf.instance_eval('@@name')正确抛出了错误。这不是一个实例变量,它是一个 class 变量。你会想要自己拥有 MySelf.class_eval('@@name'),然后它就会起作用。

在此处查看回复:https://repl.it/Be0U/0

要设置 class 变量,请像这样使用 class_variable_set

 MySelf.class_variable_set('@@name', 'graham')