2013-03-12 6 views
5

io non sono sicuro di come questo è un codice valido:Rubino << (il doppio meno) con le variabili di istanza

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 

Questo stamperà:

WoW SC2 D3 Titan

penserei che dovrebbe stampare

WoW SC2 D3

Il metodo add_game non utilizza la variabile di istanza. Essendo nuovo a Ruby, non capisco come funzioni. Non dovrebbe deve essere:

def add_games(game) 
    @games << game 
end 

sto leggendo questo da un tutorial e non sono stato in grado di trovare qualsiasi cosa su come < < lavora specificamente con le variabili di istanza. Ho pensato che '< <' era appena sovraccarico quando si trattava di array da 'aggiungere all'array'. In realtà sta facendo qualcosa con le classi Singleton?

+2

Per inciso, prova ad aggiungere un 'mette games' dopo l'ultima' mette lib.games' e vedrete perché '@games = games' dovrebbe essere '@games = games.dup'. –

risposta

6

Questo codice è un po 'di confusione. La linea:

games << game 

è effettivamente chiamando il metodo games, che restituisce @games. Quindi il metodo << viene chiamato su quel risultato. C'è dello zucchero sintattico nel parser Ruby che trasforma l'operatore << in una chiamata di metodo sull'operando di sinistra e l'operando di sinistra viene valutato prima che ciò accada.

Modifica per maggiore chiarezza:

La linea potrebbe essere scritto in questo modo:

(games).<< game 

o questo:

(self.games).<< game 

o:

(self.games) << game 

che eseguono tutti il ​​metodo games.

+0

Ah, questo ha molto più senso per Jim. Grazie! – sjmh

+1

Oppure 'games() << game' che sarebbe stato auto-documentante e probabilmente eviterebbe la confusione in primo luogo. –

+0

senza i genitori è molto più DSL-ish e incapsula-y, IMO. – radarbob

0

utilizza variabile di istanza di classe, guarda il tuo codice:

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

Perché "variabile istanza di classe" anziché semplice "variabile d'istanza"? – hdgarrood

Problemi correlati