2014-02-13 58 views
0

下面的代碼:attr_accessor如何知道:player = @player?

class Dungeon 
    attr_accessor :player 
    def initialize(player_name) 
    @player = Player.new(player_name) 
    end 
end 

現在,如果我寫的:

dungeon = Dungeon.new("Robert") 
puts dungeon.player.name 

它顯然會吐出Robert

我對Ruby有點新,所以請原諒我,如果這個問題對所有人都是顯而易見的。我正在努力將頭圍繞在它周圍。我正在學習「實例」,「類」和全局變量,我的問題是:Ruby如何知道:player在上面的代碼中是指@player?爲什麼不寫代碼,而是:@player

這是否有意義?

+0

「@」字符實際上並不是符號的一部分,它只是表示'player'是一個實例變量而不是局部變量。 – roippi

+0

當你學習不同的語言時,你會發現有些東西是巫術和黑魔法。這是其中的一件事。 Ruby的內部工作定義了'attr_accessor'來映射符號,比如':player',指向一個在該類中定義的實例變量'@ player'。它可能沒有什麼幫助,但只要接受它就是這樣,Ruby就是這樣寫的。 –

回答

1

attr_accessor只是一個定義公共getter/setter的方法。 @player是存儲值的實際實例變量。它產生吸氣基於符號名字,所以:player創建這些方法:

def player 
    @player 
end 

def player=(player) 
    @player = player 
end 

如果你只是想吸氣,你可以使用attr_reader。如果你只想要二傳手,你可以使用attr_writerattr_accessor結合了這兩種方法,並給你兩種方法。

1

有一件事情是容易被忽視時,首先學習Ruby是構建

attr_accessor :property_name 

只是一個寫getter和setter方法的類的實例變量的短方式:

# getter 
def property_name 
    @property_name 
end 

# setter 
def property_name=(some_value) 
    @property_name = some_value 
end 

它基本上是Ruby中的「元編程」支持的一個例子,但它感覺像是更神祕的東西。

而且,你不必使用符號的風格,你可以改爲有:

attr_accessor "property_name" 

符號版本只是「讀更好」爲最多的人。