2013-04-02 7 views
5

io sono un newb lavoro attraverso alcuni tutorial Rubino e stumped sul uso del metodo send di seguito. Riesco a vedere che il metodo send sta leggendo il valore dell'attributo iteratore, ma la documentazione di Ruby afferma che il metodo send usa un metodo anteposto ai due punti. Quindi, la mia confusione sta nel come il metodo di invio di seguito è l'interpolazione variabile attributo viene iterato.metodo di invio di Ruby con il blocco di interpolazione variabile

module FormatAttributes 
    def formats(*attributes) 
    @format_attribute = attributes 
    end 

    def format_attributes 
    @format_attributes 
    end 
end 

module Formatter 
    def display 
    self.class.format_attributes.each do |attribute| 
     puts "[#{attribute.to_s.upcase}] #{send(attribute)}" 
    end 
    end 
end 

class Resume 
    extend FormatAttributes 
    include Formatter 
    attr_accessor :name, :phone_number, :email, :experience 
    formats :name, :phone_number, :email, :experience 
end 
+1

'send' può prendere le stringhe così, non solo i simboli. "metodo anteposto ai due punti": è un simbolo, è un concetto di rubino molto semplice. Quindi, qual è esattamente la tua domanda di nuovo? –

+0

In che modo # {send (attribute)} viene interpolato nel singolo valore dell'attributo? – KMcA

+0

'attribute' è nome attributo,' send (attributo) 'ottiene valore per nome,' # {invia (attributo)} 'lo inserisce in una stringa. Non è diverso da, ad esempio, '# {pippo}' o '# {10 * 20}'. –

risposta

2

non è "invocando il valore del iteratore", ma invece di chiamare un metodo con quel nome. In questo caso, a causa della dichiarazione attr_accessor, questi metodi si associano alle proprietà.

Chiamare object.send('method_name') o object.send(:method_name) sono equivalenti a object.method_name in termini generali. Analogamente, send(:foo) e foo chiamerà il metodo foo sul contesto.

Poiché la module dichiarare un metodo che viene successivamente miscelato con un include, chiamando send nel modulo ha l'effetto di chiamare un metodo su un'istanza della classe CV.

+0

@tadam, grazie! Essendo nuovo non pensavo che attr_accessor stesse trasformando le proprietà in metodi. Ha perfettamente senso ora. – KMcA

+1

'attr_reader' crea un metodo di lettura (getter), 'attr_writer' crea un metodo di scrittura (setter) e' attr_accessor' crea entrambi. – tadman

0

send Documentation

qui è semplificato versione del codice, di feed che cosa sta succedendo:

def show 
p "hi" 
end 

x = "show" 
y = :show 

"#{send(y)}" #=> "hi" 
"#{send(x)}" #=> "hi" 
+1

Vale la pena notare che 'x =: mostra; "# {send (x)}" 'funzionerebbe anche. Penso che in questo caso i valori stringa vengano convertiti in simboli, quindi una parte della risposta all'OP potrebbe essere "Ruby fornisce la coercizione incorporata e che consente al codice inviato di funzionare" –

+0

@NeilSlater che ho provato a mostrargli, come inviare lavori. Questo è tutto. Qualche problema nel mio codice? correggimi. Non ti ho preso. –

+0

Niente di sbagliato con il tuo codice. Stavo solo cercando di unirlo a qualcosa che ho notato nell'OP ("prende un metodo anteposto ai due punti") –

Problemi correlati