Ruby est interprété. Les variables sont des références aux données, mais pas aux données elles-mêmes. Cela facilite l'utilisation de la même variable pour des données de types différents.
L'affectation de lhs = rhs copie alors la référence sur les rhs, pas les données. Cela diffère dans d'autres langages, tels que C, où l'affectation effectue une copie des données vers lhs à partir de rhs.
Donc, pour l'appel de fonction, la variable passée, disons x, est en effet copiée dans une variable locale dans la fonction, mais x est une référence. Il y aura alors deux copies de la référence, toutes deux faisant référence aux mêmes données. Un sera dans l'appelant, un dans la fonction.
L'affectation dans la fonction copiera alors une nouvelle référence à la version de x de la fonction. Après cela, la version de x de l'appelant reste inchangée. C'est toujours une référence aux données originales.
En revanche, en utilisant la méthode .replace sur x, Ruby effectuera une copie des données. Si replace est utilisé avant toute nouvelle affectation, alors l'appelant verra également les données changer dans sa version.
De même, tant que la référence d'origine est intacte pour la variable passée, les variables d'instance seront les mêmes que celles que l'appelant voit. Dans le cadre d'un objet, les variables d'instance ont toujours les valeurs de référence les plus à jour, qu'elles soient fournies par l'appelant ou définies dans la fonction à laquelle la classe a été transmise.
L'appel par valeur ou l'appel par référence est embrouillé ici à cause de la confusion sur '=' Dans les langues compilées '=' est une copie de données. Voici dans ce langage interprété '=' est une copie de référence. Dans l'exemple, vous avez transmis la référence suivie d'une copie de référence si '=' qui détruit l'original passé en référence, puis les gens qui en parlent comme si '=' étaient une copie de données.
Pour être cohérent avec les définitions, nous devons conserver «.replace» car il s'agit d'une copie de données. Du point de vue de «.replace», nous voyons que cela est effectivement passé par référence. De plus, si nous parcourons le débogueur, nous voyons des références transmises, car les variables sont des références.
Cependant, si nous devons conserver '=' comme cadre de référence, alors nous pouvons effectivement voir les données transmises jusqu'à une affectation, puis nous ne pouvons plus le voir après l'affectation alors que les données de l'appelant restent inchangées. Au niveau comportemental, il s'agit d'une valeur de passage tant que nous ne considérons pas la valeur transmise comme composite - car nous ne pourrons pas en conserver une partie tout en modifiant l'autre partie dans une seule affectation (comme cette affectation modifie la référence et l'original sort du cadre). Il y aura également une verrue, dans ce cas, les variables dans les objets seront des références, comme toutes les variables. Par conséquent, nous serons obligés de parler de passer des «références par valeur» et d'utiliser des locutions connexes.