Les objets ruby sont passés en référence ou en valeur dans les méthodes ?

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.

(https://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 : https://www.ruby-forum.com/topic/41160

https://khelll.com/blog/ruby/ruby-pass-by-value-or-by-reference/

Blog de BobMaerten et de PagedeGeek