2012-02-07 14 views
0

正如標題所說@var和@@變種之間的區別,紅寶石新手,就是在一個類

就是在一個類定義@var@@var之間的區別? 另外,定義方法中self.mymethodmymethod之間有什麼區別?

回答

2

自我總是指當前object.Check以下例如: -如此命名是因爲它們具有範圍內

class Test 
    def test 
    puts "At the instance level, self is #{self}" 
    end 
    def self.test 
    puts "At the class level, self is #{self}" 
    end 
end 
Test.test 
#=> At the class level, self is Test 
Test.new.test 
#=> At the instance level, self is #<Test:0x28190> 

對象變量,並關聯到 ,目前object.an對象變量,然後可以從該對象內的任何其他方法訪問。

類變量對於存儲與某個類的所有對象 有關的信息特別有用。

4

@@ var是類變量,它在類和該類的所有實例之間共享。您可以從類方法和實例方法訪問此變量。

class C 
    @@a = 1 

    def self.m1 # define class method (this is similar to def C.m1, because self will evaluate to C in this context) 
    @@a 
    end 

    def m2 # define instance method 
    @@a 
    end 
end 

C.m1 # => 1 
C.new.m2 # => 1 

@var是類實例變量。通常情況下,您可以從類方法訪問此實例變量。

class C 
    @a = 1 

    def self.m1 
    @a 
    end 

    def m2 
    # no direct access to @a because in this context @a will refer to regular instance variable, not instance variable of an object that represent class C 
    end 
end 

C.m1 # => 1 

這些變量可能會造成混亂,你應該永遠知道你定義實例變量@...上下文 - 它可能在這代表了一類或可能是常規的對象的實例對象的實例來定義。

1

直觀地說,實例變量用於跟蹤每個對象的狀態。另一方面,類變量用於跟蹤類的所有實例的狀態。例如。您可以使用@@算把這個類的已被實例化,像這樣的對象數量的軌道:

class User 
    @@count = 0 

    attr_reader :name 
    def initialize(name) 
    @@count += 1 
    @name = name 
    end 
end 

User.count爲您提供了迄今已實例化的用戶數量。 user = User.new('Peter')將User.count增加1,user.name返回Peter。