11
votes

Comment retourner un tableau appartenant à une fonction?

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: xxx

Ceci échoue de manière compilation avec cette erreur: xxx

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.

Tous les conseils sur la manière d'extraire correctement mon tableau?

BTW, j'utilise ROULE 0,8


2 commentaires

~ 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 et entiers auto non défini, ce qui n'est bien sûr pas autorisé. Vous vouliez probablement renvoyer un pointeur emprunté, ne pas enlever self.theies .


~ [T] est appelé un vecteur , pas un tableau . 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.


3 Réponses :


8
votes

=== edit fort> ===

dans la rouille 1 Stable, ~ [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>

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>

=== EDIT END FORT> === P>

dans la rouille, le . code> après auto code>, auto-dereferrences auto code>, il s'agit donc de la Déréférence de & pointeur code> que l'erreur mentionne.

L'appropriation de la chose est maintenant la partie que vous ne peut pas sortir de code> la Dréréférence: p> xxx pré>

Vous pouvez emprunter une référence à Funies à la place: p>

fn somethings(&self) -> ~[int] {
    self.thingies.clone()
}


1 commentaires

Déteste de te faire ping, mais plus de gens essaient de mettre à jour les questions pré-1.0. Ayons un Bigger Group Chat .



14
votes

La raison pour laquelle votre code ne compile pas est qu'un pointeur unique ~ 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).

Solution de copie forte> xxx pré>

Solution de référence forte> p> xxx pré>

Solution de tranche forte> p >

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
    }
}


2 commentaires

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 Méthode: fn quelque chose <'a> <(&' A Mut-auto) -> & 'a mut ~ [int] ... .


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 à & '.



2
votes

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
    }
}


0 commentaires