Ruby类级实例变量

时间:2010-08-22 05:53:40

标签: ruby-on-rails ruby

所以我正在回顾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

这到底是做什么的?什么是他自我上课?那么是一个数组吗?请尽可能详细说明。谢谢。

1 个答案:

答案 0 :(得分:6)

<<不是一种方法(不是Array BTW独有的),而是定义metaclass

的语法

基本上,元类是单个对象的类(有些人称它们为单例类)。例如,如果您定义

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的元类中定义一个实例变量 。也就是说,Triange类也是一个对象,它将有一个名为sides的实例变量

thisthis个链接中的详细信息。得到这个想法之后,转到最近的irb控制台并进行实验。