Les objets ruby sont passés en référence ou en valeur dans les méthodes ?
Par rivsc le vendredi 17 février 2012, 12:01 - Lien permanent
Bon à la suite d'une discussion avec BobMaerten et PagedeGeek, voici le fruit de mes recherches (merci c'est plus clair dans ma tête :-)
Donc en fait les integer sont traités différemment pour les problèmes de performance. Tous les objets Ruby sont passés par références. Le cas particulier des integers c'est que le pointeur est la valeur (pour des problèmes de performance). object_id n'est pas le pointeur, ce n'est qu'un identifiant unique de l'objet.
(http://www.ruby-forum.com/topic/41160#8333)
Voilà la source de la confusion (comportement différent avec des entiers et des tableaux) :
1.8.7 :001 > monentier = 4 => 4 1.8.7 :002 > monentier.object_id => 9 1.8.7 :003 > def modif(v) 1.8.7 :004?> v += 1 1.8.7 :005?> end => nil 1.8.7 :006 > modif(monentier) => 5 1.8.7 :007 > monentier => 4 1.8.7 :008 > monentier.object_id => 9 1.8.7 :009 > monarray = [2,3,4] => [2, 3, 4] 1.8.7 :010 > def modif2(v) 1.8.7 :011?> v << 5 1.8.7 :012?> end => nil 1.8.7 :013 > monarray => [2, 3, 4] 1.8.7 :014 > monarray.object_id => 70092968297200 1.8.7 :015 > modif2(monarray) => [2, 3, 4, 5] 1.8.7 :016 > monarray => [2, 3, 4, 5] 1.8.7 :017 > monarray.object_id => 70092968297200 1.8.7 :018 >
Un peu de lecture sur le sujet : http://www.ruby-forum.com/topic/41160
http://khelll.com/blog/ruby/ruby-pass-by-value-or-by-reference/
Blog de BobMaerten et de PagedeGeek
Commentaires
Je savais que les objets étaient passés par références, mais je n'avais jamais remarqué ce comportement avec les entiers, c'est bon à savoir !