2013-06-24 150 views
0

我不認爲類變量實例變量之間存在明顯差異。 類變量也可以看作是實例變量。我對嗎?Ruby的類變量和實例變量之間的區別

例如:

class Test 
    @class_var = 'hello world' 

    def self.show_class_var 
    @class_var 
    end 

    def show_class_var 
    puts self.class.show_class_var 
    end 
end 

所以,我想我們可以把一個類變量作爲當前類(Test)的實例變量。如果我們定義@@class_var = 'hello world',唯一的好處是我們可以在實例方法中直接引用@@class_var。我只想知道我是否正確。我是嗎?

+7

你叫什麼 「類變量」 是不是一類變量。它是一個類對象的實例變量。真實的類變量被預置爲'@@' –

+0

[實例變量,類變量和它們在紅寶石之間的區別]的可能重複(http://stackoverflow.com/questions/7329954/instance-variable-class-variable-and它們之間的差異) – quetzalcoatl

+0

謝謝大家回答我的問題:)類變量可以在子類中看到,而實例變量不能。我認爲這是主要的區別。 (我沒有想到我的問題爭吵......我不知道發生了什麼。但我仍然感謝你的耐心) – ruanhao

回答

3

我覺得 「instance variable, class variable and the difference between them in ruby」 具有良好的expla國家之間的地方,實例和類變量之間的差異。

+1

與其說「這個帖子」,與「點擊這裏」一樣糟糕,不如說用錨文本更具描述性。它可以幫助那些正在閱讀你的答案的人決定他們是否想要遵循它,並且當答案被搜索引擎索引時,它會有所幫助。請參閱W3建議「[不要使用'點擊此處'作爲鏈接文本](http://www.w3.org/QA/Tips/noClickHere)」 –

1

我不認爲類變量和實例變量之間有明顯的區別。

沒有一個微妙的區別。正如Wayne Conrad在his answer here中所述:

類和它的所有後代之間共享一個類變量(@@)。

類的實例變量(@)不被類的後代共享。

@@:類變量(我會建議使用class instance variable而不是說class variable,這將減少混亂,是新手人們普遍做到了。)

class Foo;end 
#setting class variable @@var 
Foo.class_variable_set(:@@var, "good morning!") 
#getting class variable @@var via Foo 
Foo.class_variable_get(:@@var) # => "good morning!" 
class Bar < Foo ;end 
#getting class variable @@var via Bar subclass of Foo 
Bar.class_variable_get(:@@var) # => "good morning!" 

@:實例可變

class Foo;end 
foo = Foo.new 
#setting instance variable @var 
foo.instance_variable_set(:@var, "good morning!") 
#getting instance variable @var via foo object 
foo.instance_variable_get(:@var) # => "good morning!" 
class Bar < Foo ;end 
bar = Bar.new 
#getting instance variable @var via bar object,whose class is a subclass of Foo 
bar.instance_variable_get(:@var) # => nil 
1

+1 OMG的回答,有一個轉折:不要忘記,類是它們自己的權利的對象,這意味着有三分之一不準確的類,但不是完全但實際的實例類型的變量,爲班級本身。

例子:

class A 
    # instance variable of objects of class A (and its subclasses) 
    # not shared between instances 
    def foo; @foo; end 
    def foo=(foo); @foo = foo; end 

    class << self 
    # instance variable of class A 
    # not available to subclasses of A 
    def bar; @bar; end 
    def bar=(bar); @bar = bar; end 
    end 

    # class variable of A 
    # shared by subclasses of A 
    def baz; @@baz; end 
    def baz=(baz); @@baz = baz; end 
end 

class B < A; end 

使用上面,你會得到:

a = A.new 
b = B.new 

a.foo = :foo 
a.class.bar = :bar 
a.baz = :baz 

p a.foo   # :foo 
p a.class.bar # :bar 
p a.baz   # :baz 

p b.foo   # nil 
p b.class.bar # nil 
p b.baz   # :baz 
+0

感謝您提及相同的內容,我在相同,但現在從我的編輯器中刪除了這些行。感謝您的幫助:)) –

+0

爲什麼這會得到downvoted? –

+0

我沒有投票...但是現在一天天下大雨......我完全沮喪,因爲我一直* * 1 *給你..沒有理由下投票我想:( –