2013-03-12 11 views
5

Nie jestem pewien, jak to jest poprawny kod:Ruby << (dwukrotnie mniej niż) o zmiennych instancji

class Library 
    def initialize(games) 
    @games = games 
    end 

    def add_game(game) 
    games << game 
    end 

    def games() 
    @games 
    end 
end 

games = ['WoW','SC2','D3'] 
lib = Library.new(games) 
puts lib.games 
lib.add_game('Titan') 
puts lib.games 

ten wypisze:

WoW SC2 D3 Titan

to myślę, że powinien wydrukować

WoW SC2 D3

Metoda add_game nie używa zmiennej instancji. Będąc nowicjuszem w Ruby, nie rozumiem, jak to działa. Nie powinno to być:

def add_games(game) 
    @games << game 
end 

Czytam to z samouczka i nie byłem w stanie znaleźć niczego na temat < < działa konkretnie zmiennych instancji. Myślałem, że "< <" zostało po prostu przeciążone, gdy mamy do czynienia z tablicami, które mają być "dołączane do tablicy". Czy to faktycznie robi coś z lekcjami Singleton?

+2

Tak na marginesie, spróbuj dodanie 'stawia games' po ostatnim' stawia lib.games' a zobaczysz dlaczego '@games = gry 'powinny mieć postać' @games = games.dup'. –

Odpowiedz

6

Ten kod jest trochę zagmatwany. Linia:

games << game 

faktycznie wywołanie metody games, która zwraca @games. W takim przypadku wywoływana jest metoda <<. W analizatorze składni Ruby jest trochę cukru syntaktycznego, który zmienia operatora << w wywołanie metody na lewym argumencie, a lewy operand jest oceniany, zanim to nastąpi.

Edycja dla większej jasności:

Linia może być napisany tak:

(games).<< game 

lub to:

(self.games).<< game 

lub:

(self.games) << game 

z których wszystkie wykonują metodę games.

+0

Ah, to ma znacznie więcej sensu Jim. Dziękuję Ci! – sjmh

+1

Lub 'gry() << gra', które byłyby samodzielne i prawdopodobnie uniknęłyby zamieszania w pierwszej kolejności. –

+0

bez rodziców jest o wiele więcej DSL-owski i hermetyzowany-y, IMO. – radarbob

0

Wykorzystuje zmienną instancji klasy, spójrz na kodzie:

class Library 
    def initialize(manygames) 
    @games = manygames 
    end 

    def add_game(game) 
    imlookingforclassinstancevariable << game 
    end 

    def imlookingforclassinstancevariable 
    @games #i'm the final storage of your array 
    end 
end 
games = ['WoW','SC2','D3'] 
lib = Library.new(games) 
puts lib.imlookingforclassinstancevariable 
lib.add_game('Titan') 
puts lib.imlookingforclassinstancevariable 
+0

Dlaczego "zmienna instancji klasy" w przeciwieństwie do "zmiennej instancji"? – hdgarrood

Powiązane problemy