元类中的 Ruby 类变量

标签 ruby metaprogramming

我有一个像这样的 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 classC ,我们没有为其定义类变量 @@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/

相关文章:

c# - 以编程方式反汇编 CIL

groovy - 通过 Groovy 中的嵌套闭包传递委托(delegate)

ruby - 使用 rake 导入(调用其他 rakefile)

ruby-on-rails - Rails:ActiveRecord::AssociationTypeMismatch Team() 预期,得到 String()

mysql - 带有 Mysql 主/从的 Datamapper

ruby-on-rails - 使用载波视频上传 .MOV 文件?

ruby-on-rails - 模块 `form_for' 的未定义方法 `ActionView::Helpers::FormHelper'

python - 是否有 Python 的元编程模式目录?

formatting - 不在 sympy 的 `printing.ccode` 方法中将 X*X*X 收缩为 pow(X,3)

python - 从通用函数定义函数列表