【问题标题】:Ruby class variables in metaclass元类中的 Ruby 类变量
【发布时间】:2013-04-29 18:16:56
【问题描述】:

我有一个这样的 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

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

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

【问题讨论】:

  • 当你做 'class
  • @vgoff 什么意思:当你做 'class
  • 在你的第二堂课中
  • @vgoff 为什么范围仍然是主要的?据我所知,定义 ruby​​ 的类何时会改变它的范围。
  • 我相信这是Ruby的问题。顶部和底部代码应该给出相同的结果。请在bugs.ruby-lang.org/issues报告问题

标签: ruby metaprogramming


【解决方案1】:

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

class << C
  p @@v
end

引发异常,因为这里我们处理的是Csingleton class,我们尚未为其定义类变量@@v

真正的问题是,为什么这样做会奏效?

class C
  @@v = 1

  class << self
    p @@v
  end
end

答案似乎是,为了您的方便,无论何时您从该类内部访问一个类的单例,Ruby 都会透明地让您访问该类的类变量。

请注意,无论您使用class &lt;&lt; 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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-22
      • 2011-01-06
      • 2013-11-26
      • 2013-03-24
      • 2015-08-13
      • 1970-01-01
      • 2015-02-28
      • 1970-01-01
      相关资源
      最近更新 更多