Explication de &nomVariable et *nomVariable
Closed this issue · 3 comments
Bonjour,
Sachant l'importance que donne rust aux références vs valeurs, pour moi qui suis débutant en rust, j'aurais aimé avoir minimalement un éclaicissement à propos de * et &.
Par exemple, dans le code concernant les slices
// tab est une slice contenant 0, 1 et 2
let tab = &[0, 1, 2];
// ça affichera "[0, 1, 2]"
println!("{:?}", tab);
// s est maintenant une slice commençant à partir du 2e élément de tab
let s = &tab[1..];
// ça affichera "[1, 2]"
println!("{:?}", s);
Cela fonctionne encore avec let tab = [0, 1, 2];
mais ne fonctionne plus avec let s = tab[1..];
Pourquoi est-ce le cas ? Comment fonctionne le langage concernant les références?
Merci pour ce retour ! Je vais relire le chapitre pour combler ce manque. Je peux déjà expliquer ici le temps que je mette à jour :
Le compilateur connait la taille de l'array quand on écrit [1, 2, 3]
mais il ne connait pas sa taille quand on écrit tab[1..]
(il pourrait retrouver cette info, mais c'est un autre débat). Du coup pour contourner ce problème, on va utiliser une slice avec &
dont la taille est connue au moment de la compilation.
Quant à *
, cela enlève un niveau de référence. Par-exemple, si a
est &&str
et qu'on fait *a
, on obtient &str
.
Je croyais (mais je suis vraiment débutant en rust) que c'était une histoire de valeur versus référence.
En tout cas, merci d'avoir pris du temps pour me répondre.
Je poursuis la lecture de votre tuto/livre.
J'ai ajouté une partie sur les tableaux. Je pense cependant que tu avances plus vite que le cours ne l'avait prévu. Je ne pense pas avoir évoqué le *
avant ce chapitre donc c'est un peu surprenant que tu fasses déjà des expériences avec (pas une mauvaise chose cependant, les expériences personnelles c'est très bien !). Du coup la nouvelle partie permet de voir la différence entre les tableaux et les slices, ce qui était manquant.