Je suis un débutant rouille essayant de comprendre la langue en jouant avec elle. J'ai frappé certains problèmes sur la tentative de retour d'une matrice à partir d'une fonction: Ceci échoue de manière compilation avec cette erreur: p> Si cet échantillon de code ressemble à de toutes sortes, tout ce que j'essaie de faire est de tirer un tableau hors d'une structure mise en œuvre. Le pointeur emprunté n'est pas important, c'est juste comment j'essaie de stocker les données. P> Tous les conseils sur la manière d'extraire correctement mon tableau? P> BTW, j'utilise ROULE 0,8 P> P>
3 Réponses :
=== edit fort> === dans la rouille 1 Stable, Le modèle de propriété de Rust est tout à fait au centre de la langue, alors pour plus d'informations, je suggère de regarder la grande documentation officielle sur Propriété et Emprunter P> === dans la rouille, le . code> après L'appropriation de la chose est maintenant la partie que vous Vous pouvez emprunter une référence à Funies à la place: p> ~ [t] code> est devenu
VEC code>, mais (Syntaxe de côté) Le même problème s'applique, car une VEC a toujours un propriétaire unique. En bref,
quelque chose code> n'a qu'une référence à soi et (via la référence), il ne peut pas devenir le propriétaire de
Thksies code>. Lien de terrain de jeu à la rouille 1 Version ICI: https://play.rust-lang.org/ ? gist = 50ec1acdc684e53fd5f9 & Version = Stable . P>
auto code>, auto-dereferrences
auto code>, il s'agit donc de la
Déréférence de & pointeur code> que l'erreur mentionne.
ne peut pas sortir de code> la Dréréférence: p>
fn somethings(&self) -> ~[int] {
self.thingies.clone()
}
Déteste de te faire ping, mais plus de gens essaient de mettre à jour les questions pré-1.0. Ayons un Bigger Group Chat .
La raison pour laquelle votre code ne compile pas est qu'un pointeur unique Solution de copie forte> Solution de tranche forte> p > ~ code> ne peut avoir qu'un seul propriétaire. Le compilateur vous empêche de rédiger un code sujet d'erreur. Vous pouvez soit décider de revenir une copie des truces, une référence aux trucs, ou une tranche de trucs (qui est une référence aux données vectorielles ou à un segment de celui-ci).
struct Widget {
thingies: ~[int]
}
impl Widget {
fn new() -> Widget {
Widget { thingies: ~[4, 8, 15, 16, 23, 42] }
}
fn somethings<'a>(&'a mut self) -> &'a mut ~[int] {
&mut self.thingies
}
}
Vous n'avez pas besoin de mettre une annotation à vie sur une structure à moins que vous ne devez avoir emprunté des pointeurs à l'intérieur de la structure. Ce n'est pas le cas. Vous pouvez simplement paramétrer Méthode code> Méthode:
fn quelque chose <'a> <(&' A Mut-auto) -> & 'a mut ~ [int] ... code>.
En ce qui concerne le commentaire de 0,8, j'ai trouvé le code travaillait comme avec & 'a. Je n'avais pas besoin de le changer à & '.
Vous ne pouvez pas sortir du pointeur emprunté, comme cela est expliqué dans d'autres réponses. Mais vous pouvez passer auto code> par valeur ou par pointeur appartenant, vous pourrez renvoyer le vecteur appartenant à la propriété:
struct Widget {
thingies: ~[int]
}
impl Widget {
fn somethings(self) -> ~[int] {
self.thingies
}
}
~ CODE> est un pointeur unique et il ne peut y avoir l'un d'entre eux que (à la même valeur). Ils ne peuvent pas être copiés (aliasés) comme des indicateurs CRW C. Essayer de créer une autre valeur (la valeur de retour) déplace la valeur du pointeur d'origine, ce qui rendrait
truceses code> et entiers
auto code> non défini, ce qui n'est bien sûr pas autorisé. Vous vouliez probablement renvoyer un pointeur emprunté, ne pas enlever
self.theies code>.
~ [T] est appelé un vecteur i>, pas un tableau i>. Les personnes de distinction dessinent généralement entre les deux sont qu'un tableau est de taille statique pendant que un vecteur peut se développer ou rétrécir.