Ruby Language Il y a toujours un récepteur implicite


Exemple

Dans Ruby, il y a toujours un récepteur implicite pour tous les appels de méthode. Le langage garde une référence au récepteur implicite actuel stocké dans la variable self . Certains mots-clés de langage tels que class et module changeront ce que le self indique. Comprendre ces comportements est très utile pour maîtriser la langue.

Par exemple, lorsque vous ouvrez irb première fois

irb(main):001:0> self
=> main

Dans ce cas, l'objet main est le récepteur implicite (voir http://stackoverflow.com/a/917842/417872 pour plus d'informations sur main ).

Vous pouvez définir des méthodes sur le récepteur implicite en utilisant le mot-clé def . Par exemple:

irb(main):001:0> def foo(arg)
irb(main):002:1> arg.to_s
irb(main):003:1> end
=> :foo
irb(main):004:0> foo 1
=> "1"

Cela a défini la méthode foo sur l'instance de l'objet principal s'exécutant dans votre repl.

Notez que les variables locales sont recherchées avant les noms de méthode, de sorte que si vous définissez une variable locale avec le même nom, sa référence remplacera la référence de méthode. Suite de l'exemple précédent:

irb(main):005:0> defined? foo
=> "method"
irb(main):006:0> foo = 1
=> 1
irb(main):007:0> defined? foo
=> "local-variable"
irb(main):008:0> foo
=> 1
irb(main):009:0> method :foo
=> #<Method: Object#foo>

La method méthode peut toujours trouver la méthode foo car elle ne vérifie pas les variables locales, alors que la référence normale foo fait.