Ruby类级实例变量

den*_*iss 3 ruby ruby-on-rails

所以我正在回顾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
Run Code Online (Sandbox Code Playgroud)

所以我真正想要了解的是(可能你们已经猜到了),

class << self; attr_accessor :sides end
Run Code Online (Sandbox Code Playgroud)

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

Chu*_*bas 6

<<不是一个方法(不是Array BTW独有的),而是定义元类的语法

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

x = Foo.new
y = Foo.new
class << x
  def quack
    "Quack!"
  end
end
Run Code Online (Sandbox Code Playgroud)

然后调用x.quack将返回"嘎嘎",但y.quack会抛出一个NoMethodError.因此,代码仅在x的元类上进行评估.

但是......类也是对象,对吗?所以,当你评估那条线时,它就等同于做

class << Triangle
  attr_accessor :sites
end
Run Code Online (Sandbox Code Playgroud)

这将只在Triangle的元类中定义一个实例变量.也就是说,Triange类也是一个对象,它将有一个名为的实例变量sides

更多信息在这个这个链接.得到这个想法后,转到最近的irb控制台并进行实验.