任何人都可以告訴我有關類變量和類實例變量之間的區別嗎?類變量和類實例變量之間的區別?
79
A
回答
132
類變量(@@
)在該類及其所有後代中共享。類實例變量(@
)不被類的後代共享。
類變量(@@
)
讓我們有一個類Foo有一個類變量@@i
和存取方法進行讀取和寫入@@i
:
class Foo
@@i = 1
def self.i
@@i
end
def self.i=(value)
@@i = value
end
end
而派生類:
class Bar < Foo
end
我們看到,Foo和酒吧有@@i
相同的值:
p Foo.i # => 1
p Bar.i # => 1
和不斷變化的@@i
在一個改變它在兩個:
Bar.i = 2
p Foo.i # => 2
p Bar.i # => 2
類實例變量(@
)
讓我們用一個類實例va做一個簡單的類可變結構@i
和存取讀取和寫入@i
:
class Foo
@i = 1
def self.i
@i
end
def self.i=(value)
@i = value
end
end
而派生類:
class Bar < Foo
end
我們看到,雖然酒吧繼承了@i
訪問器,它不繼承@i
本身:
p Foo.i # => 1
p Bar.i # => nil
我們可以設置Bar的@i
而不影響Foo的@i
:
Bar.i = 2
p Foo.i # => 1
p Bar.i # => 2
59
首先,你必須明白,類實例太 - Class
類的實例。
一旦你理解了,你可以理解一個類可以擁有與它相關的實例變量,就像一個普通的(讀取:非類)對象一樣。
Hello = Class.new
# setting an instance variable on the Hello class
Hello.instance_variable_set(:@var, "good morning!")
# getting an instance variable on the Hello class
Hello.instance_variable_get(:@var) #=> "good morning!"
注意,上Hello
實例變量是對Hello
hello = Hello.new
# setting an instance variable on an instance of Hello
hello.instance_variable_set(:@var, :"bad evening!")
# getting an instance variable on an instance of Hello
hello.instance_variable_get(:@var) #=> "bad evening!")
# see that it's distinct from @var on Hello
Hello.instance_variable_get(:@var) #=> "good morning!"
在另一方面甲類變量一個實例完全無關的且不同於一個實例變量是一種以上兩者的組合,因爲它可通過Hello
本身及其實例以及Hello
及其實例的子類獲得:
HelloChild = Class.new(Hello)
Hello.class_variable_set(:@@class_var, "strange day!")
hello = Hello.new
hello_child = HelloChild.new
Hello.class_variable_get(:@@class_var) #=> "strange day!"
HelloChild.class_variable_get(:@@class_var) #=> "strange day!"
hello.singleton_class.class_variable_get(:@@class_var) #=> "strange day!"
hello_child.singleton_class.class_variable_get(:@@class_Var) #=> "strange day!"
很多人都說,避免class variables
,因爲上面的奇怪的行爲,並建議使用class instance variables
代替。
相關問題
- 1. Ruby的類變量和實例變量之間的區別
- 2. 類別和實例變量
- 3. **變量和變量[] []之間的區別?
- 4. python類實例變量和類變量
- 5. 類變量和實例變量之間的差異
- 6. 屬於類對象的「@」實例變量和Ruby中的「@@」類變量之間的區別?
- 7. 類變量和類實例有什麼區別?
- 8. python中的實例變量和屬性之間的區別?
- 9. Ruby類實例變量與類變量
- 10. 類別級別定義的類別變量和變量之間的區別是什麼
- 11. 實例和類變量
- 12. 在一類,就是沒有修改在C#中的實例變量和變量之間的區別
- 13. 浮點變量和雙變量數據類型之間的區別
- 14. Ruby中的類實例變量和實例變量
- 15. Ruby - 變量和@variable之間的區別
- 16. 類擴展中聲明的變量和實現類中的變量之間有什麼區別
- 17. Ruby中的類變量實例變量
- 18. Objective-C:類別中的實例變量
- 19. Ruby類級別的實例變量
- 20. 實例變量的類別擴展
- 21. 目標C類別的實例變量
- 22. 使用__init__和設置類變量之間的區別
- 23. 賦值:屬性和類變量之間的區別?
- 24. PLSQL綁定變量和主機變量之間的區別
- 25. TypeScript - 私有變量和受保護變量之間的區別
- 26. jQuery緩存元素,$變量和變量之間的區別?
- 27. if(!!變量)和if(變量)之間的區別?
- 28. %變量%和!變量之間的區別!批處理文件
- 29. 類變量vs實例變量--Python
- 30. 類型的實例變量
爲什麼使用類方法返回實例變量? 你經常遇到這種情況嗎? – sekmo 2017-05-13 10:25:21
@sekmo這些示例中的訪問器返回屬於類的_class實例變量_或屬於類層次結構的_class variables_。它們不會返回屬於該類實例的純_實例變量_。術語「實例變量」,「類實例變量」和「類變量」相當混亂,不是嗎? – 2017-05-13 16:03:32