我有以下内容:
class Test
@@a = 10
def show_a()
puts "a: #{@@a}"
end
class << self
@@b = '40'
def show_b
puts "b: #{@@b}"
end
end
end
为什么以下工作有效:
Test.instance_eval{show_b}
b: 40
=> nil
但我无法访问@@b
直接地?
Test.instance_eval{ @@b }
NameError: uninitialized class variable @@b in Object
同样,下面的作品
t = Test.new
t.instance_eval{show_a}
a: 10
=> nil
但以下失败
t.instance_eval{ @@a }
NameError: uninitialized class variable @@a in Object
我不明白为什么我不能直接从类访问类变量instance_eval
blocks.
我刚刚在 RubyKaigi 聚会上向 Matz 提出了同样的问题。我已经喝得半醉了,但他却完全清醒,所以你可以将此作为确定的答案。
Anton 是对的 - 无法通过 instance_eval() 访问类变量的原因是“只是因为”。甚至 class_eval() 也有同样的问题(Matz 本人并不完全确定 class_eval() ,直到我告诉他我已经尝试过了)。更具体地说:就作用域而言,类变量更像常量而不是实例变量,因此在访问它们时切换 self(如 instance_eval() 和 class_eval() 所做的那样)不会产生任何差异。
一般来说,完全避免类变量可能是个好主意。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)