我有一个像这样的 ruby 类:
class C
@@v = 1
class << self
p @@v # everything goes well here
end
end
class << C
# here I get an exception
# `singletonclass': uninitialized class variable @@v in Object (NameError)
# from a.rb:5:in `<main>'
p @@v
end
我的问题是:异常显示“Object (NameError) 中未初始化的类变量 @@v”,但为什么 ruby 查找 Object(main) 中的类变量?
似乎 ruby 总是在它之外查找元类的类变量。
最佳答案
你已经定义了类变量@@v
上课 C
.我们不应该对此感到惊讶:
class << C
p @@v
end
引发异常,因为这里我们正在处理 singleton class的 C
,我们没有为其定义类变量 @@v
.
真正的问题是,为什么这样做会奏效?
class C
@@v = 1
class << self
p @@v
end
end
答案似乎是,为了您的方便,无论何时您从该类内部访问该类的单例,Ruby 都会透明地让您访问该类的类变量。
请注意,无论您是否使用 class << self; def method_name
,这在您定义方法时也始终有效。语法或 def self.method_name
语法:
# assuming @@v in C is 1
class C
def self.print_v_from_inside
p @@v
end
end
def C.print_v_from_outside
p @@v
end
C.print_v_from_inside
# => 1
C.print_v_from_outside
# => NameError: uninitialized class variable @@v in Object
关于元类中的 Ruby 类变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16391178/