3

我有一个这样的红宝石课程:

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

我的问题是:异常说'未初始化的类变量@@v in Object(NameError)',但是为什么ruby在Object(main)中查找类变量?

似乎 ruby​​ 总是在它之外查找元类的类变量。

4

2 回答 2

3

@@v您已经为类定义了类变量C。我们不应该对此感到惊讶:

class << C
  p @@v
end

引发异常,因为这里我们正在处理 的单例类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
于 2013-05-06T13:40:03.133 回答
0

我相信这是Ruby的问题。顶部和底部代码具有相同的 self 和 class,并且应该给出相同的结果。请在http://bugs.ruby-lang.org/issues/报告问题

于 2013-05-06T09:14:49.127 回答