所以我正在回顾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
这到底是做什么的?什么是他自我上课?那么是一个数组吗?请尽可能详细说明。谢谢。
答案 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
的实例变量