2014-05-02 41 views
5

根據wikibooks ...屬於類對象的「@」實例變量和Ruby中的「@@」類變量之間的區別?

  • @one下面是一個實例變量屬於類對象(注意,這是不一樣的類變量和如@@one不能被稱爲)
  • @@value類變量(與Java或C++中的靜態類似)。
  • @two是屬於MyClass的實例的實例變量

我的問題:

什麼@One和@@值之間的差異?
另外,是否有理由使用@one?

class MyClass 
    @one = 1 
    @@value = 1 

    def initialize() 
    @two = 2 
    end 
end 

回答

5

@one是類的一個實例變量MyClass@@value是類變量MyClass。作爲@one是一個實例變量它僅由類MyClass擁有(在Ruby類也是對象),不共享,但@@value共享變量

共享變量

class A 
    @@var = 12 
end 

class B < A 
    def self.meth 
    @@var 
    end 
end 

B.meth # => 12 

非共享變量

class A 
    @var = 12 
end 

class B < A 
    def self.meth 
    @var 
    end 
end 

B.meth # => nil 

@two是類MyClass的實例的一個實例變量。

實例變量是對象的私有屬性,因此它們不會共享它。在Ruby中,類也是對象。 @one您在類MyClass中定義,因此它只由定義該類的類擁有。另一方面,@two實例變量將在您創建類MyClass的對象(如ob,使用MyClass.new)時創建。 @two只屬於ob,其他任何對象都不知道。

+1

'@ one'與'@ two'有什麼不同?我明白@two屬於MyClass的實例,但我不明白實例變量只能屬於類對象,而不屬於類的實例。 – ayjay

+0

@ayjay現在清楚了嗎? –

+0

是的。感謝您的解釋! – ayjay

0

我想到的方式是誰應該掌握信息或能夠完成任務(因爲它對於類方法和實例方法是一樣的)。

class Person 
    @@people = [] 

    def initialize(name) 
    @name = name 
    @@people << self 
    end 

    def say_hello 
    puts "hello, I am #{@name}" 
    end 
end 

# Class variables and methods are things that the collection should know/do 
bob = Person.new("Bob") # like creating a person 
Person.class_variable_get(:@@people) # or getting a list of all the people initialized 

# It doesn't make sense to as bob for a list of people or to create a new person 
# but it makes sense to ask bob for his name or say hello 
bob.instance_variable_get(:@name) 
bob.say_hello 

我希望有幫助。