Pourquoi ne pas utiliser le mot «passer par référence» en Java, JavaScript, Python, Ruby, etc.?

La seule raison que je pense est "parce qu'il est confondu avec le" passage par référence "en C ++, C #, PHP, etc."

Java, Python, Ruby, JavaScript (ECMAScript), etc. sont mentionnés, mais dans cet article, Java est principalement considéré comme un représentant d'entre eux. Cependant, la même chose peut être dite pour d'autres langues, de sorte que le terme «passer par référence» ne doit pas non plus être utilisé.

Qu'est-ce que le vrai passe par référence?

Ceci est un exemple de passage par référence en C ++.

#include <iostream>
using namespace std;
void f(int x) {
  x = 1;
}
void g(int &x) {
  x = 2;
}
int main(void) {
  int n = 0;
  cout << n << endl; // => 0
  f(n);
  cout << n << endl; // => 0
  g(n);
  cout << n << endl; // => 2
}

«f» est passé par valeur et «g» est passé par référence. En passant par valeur, l'affectation à un argument formel n'a aucun effet sur l'argument réel, mais en passant par référence, l'affectation à un argument formel est affectée à l'argument réel lui-même. Par référence, les arguments formels peuvent également être considérés comme des alias pour des arguments réels.

Que dois-je faire si je suis confus?

Cela est dû au fait que la personne à qui on a dit que le type de référence Java passant est "passant par référence" ne peut pas comprendre le code ci-dessus en regardant le passage C ++ par référence. En Java, même si l'argument formel est un type référence, l'argument réel ne peut pas être modifié en attribuant l'argument formel lui-même. En d'autres termes, il s'agit d'un comportement complètement différent de ce que l'on appelle le passage par référence en C ++. Si vous l'appelez avec le même nom, vous ne pourrez pas comprendre quel est le comportement correct.

Pourquoi y a-t-il tant de gens en Java qui l'appellent «passer par référence»?

Également en C ++, il est exprimé comme un type de référence. Cependant, la signification de «référence» est différente de celle du type de référence Java. En effet, lorsque vous dites «référence» en C ++, cela signifie «référence à la variable [^ 1]», mais lorsque vous dites «référence» en Java, cela signifie «référence à un objet (réel)» [^ 2]. Il est probable qu'il réinvente le mot «passe par référence» en marchant seul sans comprendre cette différence.

N'est-il pas normal que le sens diffère selon la langue?

Certes, il existe des termes qui ont des significations différentes selon la langue et sa communauté, comme le «type de référence» ci-dessus. Cependant, dans la plupart des cas, pour éviter les malentendus, le sens sous-jacent est commun entre les langues et ne dépend que des circonstances propres à cette langue. À moins qu'il ne soit strictement défini par des spécifications, il doit être utilisé autant que possible dans un sens indépendant de la langue. En premier lieu, passer un type de référence en Java est un comportement complètement différent du passage par référence en C ++, et il est difficile de dire que c'est fondamentalement courant.

Pourtant, certains peuvent se demander si les deux peuvent être "passés par référence" car les langues sont différentes. Dans ce cas, vous devriez penser à C #. En C #, le type référence est passé de la même manière qu'en Java, mais il est également possible de passer par référence en C ++. Si Java et C ++ utilisent à la fois le terme «passer par référence», alors en C # les deux modes de transmission peuvent être appelés «passer par référence». Cependant, si l'un est appelé différemment, le même comportement devra être renommé en fonction de la langue, ce qui entraînera une confusion supplémentaire et rendra encore plus difficile la compréhension du comportement.

Je ne suis pas confus, vous pouvez donc l'utiliser.

Même si vous êtes bon, la personne qui lit l'article que vous avez écrit peut être confuse. Les gens qui ne savent rien seront confus, du moins s'il n'y a pas de notes. Si vous écrivez un article aussi déroutant, vous devez dire que vous n'avez pas la capacité d'écrire des phrases qui expliquent aux autres.

Pourtant, je veux utiliser le mot «passer par référence»!

Veuillez jurer que vous n'utiliserez pas de langages tels que C ++, C # et PHP pour le reste de votre vie. Ajoutez la phrase "Lire uniquement aux personnes qui n'utiliseront jamais un autre langage avec" passer par référence "dans un autre sens, tel que C ++, C #, PHP, etc." au début de l'article que vous écrivez. C'est recommandé. De cette façon, ni vous ni la personne qui a appelé votre article ne seront confus pour toujours.

Java a raison et C ++ est faux. Ce qui devrait être corrigé est C ++.

Le concept de passage par référence en C ++ est ancien et remonte au moins à FORTRAN II. Cependant, on ne sait pas s'il a été appelé "passe par référence" à partir de cette époque, mais au moins lorsque le premier C ++ a été fait, il semble que le mot "passer par référence" ait été utilisé pour le distinguer de "passer par valeur". .. Java a été créé plus de 10 ans plus tard. Les mots sont le gagnant de la première personne à appeler. Il est difficile de changer la signification d'un mot qui a existé auparavant, et il sera difficile de le changer en un autre nom.

Cependant, les mots changent rapidement, donc si vous faites de votre mieux pour les éclairer, leur signification peut changer dans environ 10 ans. Je ne suis ni d'accord ni de soutien avec vous, alors faites de votre mieux.

Alors quel mot dois-je utiliser?

Je l'appelle principalement "passer par référence" ou "passer par partage", mais je ne suis pas sûr que ce soit vraiment bien. J'ai posé une question sur teratail, mais je n'ai pas obtenu beaucoup de réponses. Si vous pensez que vous devriez l'appeler ainsi, veuillez répondre aux questions suivantes. Bien sûr, vous pouvez toujours dire que vous devriez l'appeler "passer par référence".

Nom de la stratégie d'évaluation pour transmettre (appeler) des objets sous une forme partageable

Référence: Ne l'appelez plus par référence

[^ 1]: Pour être exact, c'est une référence à la lvalue. De plus, depuis C ++ 11, il existe une autre "référence" appelée référence rvalue.

[^ 2]: les types de référence Java sont proches des types de pointeurs C ++. Comme ce n'est pas la «référence» mais la «valeur de référence» qui entre dans la variable, il y a quelque chose de proche du pointeur qui est la valeur réelle. En revanche, une "référence" C ++ ne signifie pas qu'une variable contient une valeur de type pointeur.

Recommended Posts

Pourquoi ne pas utiliser le mot «passer par référence» en Java, JavaScript, Python, Ruby, etc.?
Pourquoi puis-je utiliser le module en important avec python?
Rendement Python express en JavaScript ou Java
Lisez le fichier ligne par ligne avec Python
Lisez le fichier ligne par ligne avec Python
Divise la chaîne de caractères par le nombre de caractères spécifié. En Ruby et Python.
Comment utiliser la bibliothèque C en Python
Utilisez l'application LibreOffice en Python (3) Ajouter une bibliothèque
Séparer les chaînes de cas de chameau mot par mot en Python