2012-08-10 70 views
1

任何Ruby大師都能解釋這個嗎?Ruby,類變量和繼承?超類@@ var被改變了?

class Bar 
    @@x = 10 
    def self.test 
    return @@x 
    end 
end 

class Foo < Bar 
    @@x = 20 
end 


puts Bar.test # 20 why not 10? 
puts Foo.test # 20 

當我從TextMate運行此。我預計

puts Bar.test returns 10 

puts Foo.test returns 20 

但由於某些原因(我很想知道)@@ X Foo中更新酒吧的井,這是超一流的。我錯過了什麼?

+1

的http://stackoverflow.com/questions/3787154/why-class-variable-syntax-should-be-avoided-in-ruby/3787327#3787327 – 2012-08-10 21:18:08

+0

重複我同意,雖然他們沒有解釋真正發生的事情。我們可以關閉它。 – Roger 2012-08-10 21:24:12

回答

2

這是可以預料的。類變量在層次結構中共享。請參見Wikipedia中的部分:http://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Variables_and_Constants#Class_Variables

將此與類實例變量進行比較,這些變量僅對該類是私有的。

class Bar 
    @x = 10 
    def self.test 
    return @x 
    end 
end 

class Foo < Bar 
    @x = 20 
end 


Bar.test # => 10 
Foo.test # => 20 
+0

謝謝。 '重要的一點是,班級變量由班級的所有後代共享'。它的後代將我拋棄,你知道它向下運作,但從來沒有料到它會向上一樣。 – Roger 2012-08-10 21:23:35