2010-08-22 115 views
3

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

這是真的嗎?他將自己添加到課堂上?是類的數組呢?請儘可能詳盡地闡述。謝謝。

回答

6

<<不是方法(即不專用於陣列BTW),但是用於定義metaclass

基本上語法,元類是類的單個對象的(有些人稱之爲單實例類)。例如,如果你定義

x = Foo.new 
y = Foo.new 
class << x 
    def quack 
    "Quack!" 
    end 
end 

然後調用x.quack將返回「嘎嘎」,但y.quack將拋出一個NoMethodError。所以,代碼只能在x的元類上評估。

但是...類也是對象,對嗎?所以,當你評估這條線,這是做

class << Triangle 
    attr_accessor :sites 
end 

相當於將只是定義在三角元類變量一個實例。這是,在Triange類,它是一個對象也將有一個名爲sides

更多信息的實例變量在thisthis鏈接。一旦你明白了,轉到最近的irb控制檯並試驗一下。

+0

哇,這太神奇了。 – denniss 2010-08-22 06:08:35