2009-06-10 8 views
17

J'essaie de comprendre le code Ruby suivant.self.send Appel itérativement sur un argument de hachage pour initialize()

Il ressemble à attrs est un hachage qui est passé comme argument avec une valeur par défaut d'un hachage vide.

attrs.each Ensuite, attrs.each effectue une itération sur la clé, paires de valeurs dans le hachage (|k,v|).

Quel effet est obtenu en appelant self.send sur les éléments de la paire de valeurs clés au cours de cette itération?

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

+1 J'aime utiliser ce code pour flexibles création/initialisation d'objet. Voir ma réponse @ http://stackoverflow.com/questions/1778638/idiomatic-object-creation-in-ruby/5272354#5272354 – abe

Répondre

21

send appelle la méthode du premier paramètre, et transmet le reste des paramètres comme arguments.

Dans ce cas, je suppose ce qui est en attrs une liste d'attributs. Disons que c'est quelque chose comme ceci:

{ :name => "John Smith" } 

Alors dans la boucle, il le fait:

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

qui équivaut à

self.name = "John Smith" 
+0

cool. Merci. Donc, cela signifie que dans votre exemple le nom devient une méthode de classe, juste - à cause de [self.] Nom? – franz

+2

Tout d'abord, cet exemple ne crée pas une méthode du tout - qu'il appelle la méthode '' name =, qui doit déjà exister. Deuxièmement, self dans une méthode d'instance (comme initialize) fait référence à l'instance. Donc, cela appelle une méthode d'instance. – Chuck

+0

Cela vaut la peine de mentionner que les méthodes 'name =' sont automatiquement créées par l'assistant 'attr_accessor: name'. –

Questions connexes