Ruby类级别实例变量

3
所以我正在复习Ruby,看到这个人关于在Ruby中创建类级实例变量的博客。我仍在努力理解这段代码实际上是做什么的。他的博客可以在这里找到:http://railstips.org/blog/archives/2006/11/18/class-and-instance-variables-in-ruby/。我根据他的示例创建了一个简单的代码,以展示我想要理解的内容。
class Polygon
  class << self; attr_accessor :sides end
  @sides = 10
  def initialize
  end
end

class Triangle < Polygon
  @sides = 3
  class << self; attr_accessor :sides end
  def initialize
  end
end

puts Triangle.sides #3
puts Polygon.sides #10

所以我真正想理解的那一行是(也许你们已经猜到了),

class << self; attr_accessor :sides end

这个代码段的作用是什么?他是将self添加到class中吗?那么class是一个数组吗?请尽可能详细地解释一下。谢谢。
1个回答

6
<< 不是一个方法(这不仅适用于数组),而是定义元类的语法。
基本上,元类是单个对象的类(有些人称之为单例类)。例如,如果您定义:
x = Foo.new
y = Foo.new
class << x
  def quack
    "Quack!"
  end
end

那么调用x.quack将返回"Quack",但是y.quack将抛出一个NoMethodError。因此,该代码仅在x的元类上进行评估。

但是...类也是对象,对吧?因此,当您评估该行时,相当于执行

class << Triangle
  attr_accessor :sites
end

这将仅在Triangle元类中定义一个实例变量sides。也就是说,Triangle类也是一个对象,将拥有名为sides的实例变量。

更多信息请参见此链接此链接。一旦理解了这个概念,请前往最近的irb控制台进行实验。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接