Ne peuvent pas se déplacer d'emprunt d'un contenu
Je ne comprends pas l'erreur cannot move out of borrowed content
. J'ai reçu de nombreuses fois et j'ai toujours résolu, mais je n'ai jamais compris pourquoi.
Par exemple:
for line in self.xslg_file.iter() {
self.buffer.clear();
for current_char in line.into_bytes().iter() {
self.buffer.push(*current_char as char);
}
println!("{}", line);
}
produit l'erreur:
error[E0507]: cannot move out of borrowed content
--> src/main.rs:31:33
|
31 | for current_char in line.into_bytes().iter() {
| ^^^^ cannot move out of borrowed content
Je l'ai résolu par clonage line
:
for current_char in line.clone().into_bytes().iter() {
Je ne comprends pas l'erreur, même après avoir lu les autres messages comme:
- Ne peut pas emprunter Fichier de &mut auto (msg d'erreur: impossible de sortir de empruntées contenu)
- La modification d'un nœud dans un arbre de la Rouille
Quelle est l'origine de ce type d'erreur?
- Avez-vous regardé des questions de ce genre? (Btw, chaînes offrent la
.bytes()
méthode.) - Oui, j'ai regardé dedans, mais ne comprends pas 🙁 Et mon string est un std::string::String, d'après la documentation, il n'y a pas .octets() la méthode
- Il est appelé
.as_bytes()
- En fait, merci à vous, il fonctionne avec
as_bytes()
sans clonage. Mais je ne comprends toujours pas pourquoi ? String
obtient lebytes
méthode destr
.
Vous devez vous connecter pour publier un commentaire.
Regardons la signature de
into_bytes
:Cela prend
self
, pas une référence à soi (&self
). Cela signifie queself
sera consommé et ne sera plus disponible après l'appel. À sa place, vous obtenez unVec<u8>
. Le préfixeinto_
est une commune de la manière de définir des méthodes de ce genre.Je ne sais pas exactement ce que votre
iter()
méthode retourne, mais je pense que c'est un itérateur sur&String
, qui est, elle renvoie à des références à uneString
mais ne vous donne pas la propriété. Cela signifie que vous ne peut pas appeler une méthode qui consomme de la valeur.Comme vous l'avez constaté, une solution consiste à utiliser
clone
. Cela crée une copie de l'objet que vous ne propre, et peut appelerinto_bytes
sur. Comme d'autres commentateurs mentionner, vous pouvez également utiliseras_bytes
qui prend&self
, donc il fonctionnera sur un emprunt de valeur. Celui que vous devez utiliser dépend de votre objectif final de ce que vous faites avec le pointeur.Dans l'ensemble, cela a tout à voir avec la notion de propriété. Certaines opérations dépendent de la propriétaire de l'élément et d'autres opérations peuvent s'en tirer avec des emprunts de l'objet (peut-être mutably). Une référence (
&foo
) n'accordent pas la propriété, c'est juste un emprunt.Le transfert de la propriété est un concept utile en général quand je suis fait avec quelque chose, quelqu'un d'autre peut l'avoir. Dans la Rouille, c'est une façon d'être plus efficace. Je peux éviter d'allouer une copie, vous donnant une copie, puis de jeter ma copie. La propriété est également la plus permissive de l'état; si je possède un objet que je peux faire avec elle comme je le souhaite.
Voici le code que j'ai créé pour tester avec: