"
Prenons un cas plus simple. J'ai un tableau a = ["a","b","c"] et une fonction bete :
def rend_x (vecteur)
vecteur = ["x", "x", "x"]
end
Je voudrais appeler rend_x(a), et que a soit transformé en ["x", "x", "x"] (c'est-à-dire donc, que ma fonction modifie directement l'élément a -- j'insiste: c'est un exemple jouet, en pratique je m'en fout complètement, je veux juste qu'il ne recopie pas /a/ à l'appel de la fonction).
"
C'est dans ces cas-là que je pense qu'il est *nécessaire* d'avoir fait du C pour comprendre Ruby/Python/Java/autre-langage-impératif-commun.
Quand tu appelles "rend_x(foo)", dans ta fonction, "vecteur" et "foo" sont 2 variables distinctes, elles peuvent pointer au même endroit, et c'est le cas au début de ta fonction, mais elles peuvent aussi pointer des endroits différents, avec une simple affectation.
En l'occurence, quand tu fais "vecteur = ...", tu fais pointer "vecteur" vers d'autres données, sans modifier "foo" du coup. Tu alloues un nouveau tableau, totalement distinct de ton précédent ["a","b","c"], et les 2 ne sont pas à la même adresse.
(Note: à moins d'avoir des pointeurs sur pointeurs comme en C, tu ne peux pas modifier la variable "foo", mais tu peux modifier le contenu de là où elle pointe)
Si tu veux modifier le tableau, tu peux faire
vecteur[0] = "x"
vecteur[1] = "x"
vecteur[2] = "x"
En Python, il est possible de faire
vecteur[:] = ["x", "x", "x"]
qui va modifier en place le contenu de "vecteur" (il va le déréférencer), et qui ne va pas faire pointer "vecteur" vers un nouveau tableau. Un équivalent existe peut-être en Ruby, je ne connais pas assez.
Ou sinon un équivalent à :
vecteur.clear()
vecteur.extend(["x", "x", "x"])
Ou encore (méthode à éviter)
vecteur.clear()
vecteur += ["x", "x", "x"]
(qui n'est pas *du tout* équivalent à vecteur = vecteur + ["x", "x", "x"], car ce dernier ferait pointer vecteur autre part, alors que chez le premier "+=" est une opération en place pour les tableaux uniquement)
# Héritage de C
Posté par Octabrain . En réponse au message Fonction : passage de référence. Évalué à 1.
Prenons un cas plus simple. J'ai un tableau a = ["a","b","c"] et une fonction bete :
def rend_x (vecteur)
vecteur = ["x", "x", "x"]
end
Je voudrais appeler rend_x(a), et que a soit transformé en ["x", "x", "x"] (c'est-à-dire donc, que ma fonction modifie directement l'élément a -- j'insiste: c'est un exemple jouet, en pratique je m'en fout complètement, je veux juste qu'il ne recopie pas /a/ à l'appel de la fonction).
"
C'est dans ces cas-là que je pense qu'il est *nécessaire* d'avoir fait du C pour comprendre Ruby/Python/Java/autre-langage-impératif-commun.
Quand tu appelles "rend_x(foo)", dans ta fonction, "vecteur" et "foo" sont 2 variables distinctes, elles peuvent pointer au même endroit, et c'est le cas au début de ta fonction, mais elles peuvent aussi pointer des endroits différents, avec une simple affectation.
En l'occurence, quand tu fais "vecteur = ...", tu fais pointer "vecteur" vers d'autres données, sans modifier "foo" du coup. Tu alloues un nouveau tableau, totalement distinct de ton précédent ["a","b","c"], et les 2 ne sont pas à la même adresse.
(Note: à moins d'avoir des pointeurs sur pointeurs comme en C, tu ne peux pas modifier la variable "foo", mais tu peux modifier le contenu de là où elle pointe)
Si tu veux modifier le tableau, tu peux faire
vecteur[0] = "x"
vecteur[1] = "x"
vecteur[2] = "x"
En Python, il est possible de faire
vecteur[:] = ["x", "x", "x"]
qui va modifier en place le contenu de "vecteur" (il va le déréférencer), et qui ne va pas faire pointer "vecteur" vers un nouveau tableau. Un équivalent existe peut-être en Ruby, je ne connais pas assez.
Ou sinon un équivalent à :
vecteur.clear()
vecteur.extend(["x", "x", "x"])
Ou encore (méthode à éviter)
vecteur.clear()
vecteur += ["x", "x", "x"]
(qui n'est pas *du tout* équivalent à vecteur = vecteur + ["x", "x", "x"], car ce dernier ferait pointer vecteur autre part, alors que chez le premier "+=" est une opération en place pour les tableaux uniquement)