Ne vous inquiétez pas. Ruby peut être un peu délicat dans ces cas-là. Examinons le code ligne par ligne :
x = [1,2,3]
x.send :[]=,0,2
x[0] + x.[](1) + x.send(:[],2)
Première ligne
La première ligne est claire pour vous : elle attribue un tableau de trois éléments à x. Et c'est à peu près tout.
Deuxième ligne
La deuxième ligne appelle le Object#send
méthode de x
en passant un symbole (rappelez-vous que tout ce qui commence par :
est un symbole en ruby) :[]=
, 0
(a Fixnum
) et 2
(un autre Fixnum
).
Il ne vous reste plus qu'à examiner ce que fait la méthode send (comme vous avez dit l'avoir déjà fait) :
Appelle la méthode identifiée par le symbole, en lui passant les arguments spécifiés.
Cela signifie qu'il invoquera la méthode identifiée par :[]=
et passer 0
y 2
à elle. Voyons maintenant le Array#[]=
méthode. Cette définition de méthode (qui peut être surchargé par vous si vous avez besoin de le faire) est :
class Array
# ...
def []=(a, b)
# ...
end
end
Cette méthode est appelée par send
como x.[]=(0, 2)
ce qui est plutôt moche si vous voulez mon avis. C'est pourquoi Ruby définit une version de sucre syntaxique : x[0] = 2
et en général :
x.[]=(a, b) --> x[a] = b
Dans le Array
nous avons aussi le cas suivant :
x.[](a) --> x[a]
Dans les deux cas, vous êtes libre d'appeler la version qui vous semble la plus logique dans le contexte spécifique.
Troisième ligne
Maintenant, la troisième et dernière ligne :
x[0] + x.[](1) + x.send(:[],2)
les choses deviennent vraiment compliquées. Divisons-le en deux :
x[0]
x.[](1)
x.send(:[], 2)
La première est assez simple. Elle renvoie le premier élément du tableau.
Le second est le sucre syntaxique que nous avons vu précédemment et qui peut être essentiellement converti en x[1]
qui renvoie le deuxième élément du tableau.
Le troisième utilise Object#send
pour appeler la méthode []
en passant par 2
à celui-ci. Ce qui signifie qu'il appelle x.[](2)
ce qui signifie x[2]
.
Conclusion
Le code
x = [1,2,3]
x.send :[]=,0,2
x[0] + x.[](1) + x.send(:[],2)
peut être converti en utilisant :
x.send(:[]=, a, b) --> x.[]=(a, b)
x.send(:[], a) --> x.[](a)
x.[]=(a, b) --> x[a] = b
x.[](a) --> x[a]
à :
x = [1,2,3]
x[0] = 2
x[0] + x[1] + x[2]
qui peut être réduit à :
2 + 2 + 3
ce qui entraîne :
7