2009-05-17 13 views
9

Je lisais un livre Ruby et suis tombé sur cette définition de soi pseudo-variable:Ruby Définition de l'auto

auto - objet récepteur de la méthode actuelle

Quelqu'un pourrait-il tomber en panne cette définition et expliquer ce que cela signifie? Je ne comprends rien de tout cela.

EDIT: J'ai en fait une assez bonne idée de ce que c'est (et de ses applications) et je sais comment faire des recherches sur Google. Je me demandais si quelqu'un pouvait expliquer la définition que j'ai citée. Cela spécifiquement.

+0

http://www.jimmycuadra.com/posts/self-in-ruby – royhowie

Répondre

11

self est une variable spéciale qui change en fonction du contexte. Pour être plus précis, c'est l'objet récepteur de la méthode actuelle, comme vous l'avez mentionné. Pour comprendre cela, nous devons comprendre ce que signifie le récepteur.

Voir Programming Ruby: More About Methods et Classes and Objects.

vous appeler une méthode en spécifiant un récepteur , le nom de la méthode, et éventuellement certains paramètres et un bloc associé .

connection.downloadMP3("jitterbug") { |p| showProgress(p) } 

Dans cet exemple, l'objet connection est le récepteur, downloadMP3 est le nom du procédé, "jitterbug" est le paramètre , et l'étoffe entre les accolades est le bloc associé.

foo = "hello" 
bar = foo.dup 
class <<foo 
    def to_s 
    "The value is '#{self}'" 
    end 
    def twoTimes 
    self + self 
    end 
end 

foo.to_s  » "The value is 'hello'" 
foo.twoTimes » "hellohello" 
bar.to_s  » "hello" 

Dans foo.twoTimes, foo partie est appelée le récepteur de l'appel de méthode. Ainsi, dans la méthode twoTimes, self fait référence à l'objet foo dans le contexte.

There is also a very good explanation here

+0

@MauricioGracia Je ne suis pas sûr de ce que l'intention de l'édition était. Si le lien est utile, ne devrait-il pas être considéré comme une réponse? –

+0

l'intention de l'édition était de compléter une bonne réponse - en utilisant un seul lien car une réponse est une mauvaise pratique (ils suggèrent généralement de placer le contenu du lien au lieu de simplement le lien) –

17

Ruby et d'autres langues (comme Smalltalk et Objective-C) préfèrent le terme "passage de messages", alors que Java et C++ préfèrent "l'invocation de la méthode". Autrement dit, la "méthode Java" consiste à appeler une méthode sur un objet — en exécutant le code dans le contexte d'un objet — alors que la "méthode Ruby" consiste à envoyer un objet à un objet, auquel l'objet répond en exécutant sa méthode. Ruby décrirait la ligne my_string.length comme "envoi my_string le message length". Le my_string reçoit le message, et est ainsi appelé le récepteur; à l'intérieur de la définition de la méthode length, self se référerait à my_string. Vous pouvez obtenir le même effet avec my_string.send(:length).

Penser à ce concept en termes de passage de message est plus flexible que de penser en termes d'invocation de méthode. Pour invoquer une méthode sur un objet, cette méthode doit avoir été prédéfinie, alors que vous pouvez envoyer un objet à un objet qu'il peut choisir de gérer dynamiquement (avec respond_to? et method_missing).Cette flexibilité est un aspect qui permet à Ruby d'être utilisé comme des langages spécifiques au domaine (DSL) concis.

4

auto - objet récepteur de la méthode actuelle

« d'appel de la méthode » en Ruby est accompli grâce à un mécanisme d'envoi de message. Alors

some_object.some_method(args) 

est un raccourci pour

some_object.send(:some_method, args) 

Je pense que c'est ce que la citation fait référence à: « soi » est l'objet auquel a été envoyé le message (ou méthode): le récepteur de la méthode actuelle.

L'ensemble de l'envoi de messages fait partie de ce qui rend Ruby si dynamique. Il permet à un objet de définir facilement method_missing pour les messages qu'il ne gère pas actuellement et de décider quoi en faire. Rails l'utilise beaucoup: ActiveRecord, par exemple, a la syntaxe "find_by ...", qui détermine ce que l'on attend du nom de la méthode appelée/send.