2009-06-10 4 views
17

Sto cercando di capire il seguente codice Ruby.Chiamare self.send iterativamente su un argomento hash da inizializzare()

Sembra che attrs sia un hash che viene passato come argomento con un valore predefinito di un hash vuoto.

Quindi attrs.each itera sulla chiave, coppie di valori nell'hash (|k,v|).

Che effetto si ottiene chiamando lo self.send sugli elementi della coppia di valori chiave durante questa iterazione?

def initialize(attrs = {}, *args) 
    super(*args) 
    attrs.each do |k,v| 
    self.send "#{k}=", v 
    end 
end 
+0

+1 Mi piace usare questo codice per flessibili creazione/inizializzazione di oggetti. Vedi la mia risposta @ http://stackoverflow.com/questions/1778638/idiomatic-object-creation-in-ruby/5272354#5272354 – abe

risposta

21

send chiama il metodo nel primo parametro, e passa il resto dei parametri come argomenti.

In questo caso, suppongo che ciò che è in attrs sia un elenco di attributi. Diciamo che si tratta di qualcosa di simile:

{ :name => "John Smith" } 

Allora nel ciclo, lo fa:

self.send "name=", "John Smith" 

che equivale a

self.name = "John Smith" 
+0

Cool. Grazie. Quindi, questo significa che nel tuo esempio il nome diventa un metodo di classe, giusto - a causa di [self.] Nome? – franz

+2

Prima di tutto, quell'esempio non sta creando un metodo - chiama il metodo 'name =', che deve già esistere. In secondo luogo, self all'interno di un metodo di istanza (come initialize) fa riferimento all'istanza. Quindi questo sta chiamando un metodo di istanza. – Chuck

+0

Vale la pena ricordare che i metodi 'name =' vengono automaticamente creati dall'helper 'attr_accessor: name'. –

Problemi correlati