2017-01-26 1 views
1

Ich habe Probleme beim Definieren einer Funktion, die einen Vektor von Node aus der ausgewählten Kiste zurückgibt, v0.2.2. Ich habe auf diese Funktion schon länger als ich mich durch Fehlermeldungen (unterstützt von anderen Fragen online) gearbeitet habe, aber ich kann nicht herausfinden, wie die 'a Lebensdauer Variable auf den Rückgabewert zuzuweisen:Wie lege ich eine Lebensdauer fest, wenn ich das Ergebnis von document :: find aus der ausgewählten Kiste zurückgebe?

extern crate select; 

use select::document::Document; 
use select::predicate::*; 

fn elems_by_class<'a, Node>(document: &'a Document, class: &str) -> Vec<Node<>> 
    where Vec<Node>: std::iter::FromIterator<select::node::Node<'a>> 
{ 
    document.find(Attr("class", class)).iter().collect::<Vec<Node<>>>() 
} 

fn main() {} 

der Fehler ich erhalte ist

error: borrowed value does not live long enough 
    --> src/main.rs:9:5 
    | 
9 |  document.find(Attr("class", class)).iter().collect::<Vec<Node<>>>() 
    |  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ temporary value created here 
10 | } 
    | - temporary value only lives until here 
    | 
note: borrowed value must be valid for the lifetime 'a as defined on the block at 8:0... 
    --> src/main.rs:8:1 
    | 
8 | { 
    |^

Wie kann ich die 'a Lebensdauer der Funktionsaufruf zuordnen? Ich habe (erfolglos) versucht, Variablen zu verwenden, aber gelesen, dass Variablen, die innerhalb des Funktionskörpers erstellt werden, Probleme verursachen könnten, also habe ich diesen Ansatz aufgegeben. Habe ich mich zu weit in das Ausleihloch gegraben, und sollte diese Funktion einfacher definiert werden?

+1

Hinweis: Sie * nicht * Lebenszeiten zuweisen, Sie * dokumentieren * sie. Sie können es sich als * creating * vs * entdeckung * vorstellen, oder wie der Witz geht "Aber wenn Sauerstoff 1770 entdeckt wurde, wie atmeten die Leute vorher?". Das Schlüsselverständnis ist, dass Lebenszeiten existieren, ob Sie sie benennen oder nicht; und alles, was Sie tun, ist, sie zu benennen, um ihre Beziehungen besser zu verstehen (und den Compiler überprüfen zu lassen). Vielleicht sollte ich die Lebenszeiten als Sauerstoff-Leckerbissen bezeichnen? Hört sich besser an als Burritos. –

Antwort

3

Ihr Kernproblem ist, dass Sie einen generischen Typ definiert haben, der die echteNode Schatten:

fn elems_by_class<'a, Node>(document: &'a Document, class: &str) 
//     ^^^^ -- no! 

Diese sollte haben ein Duplikat Expected type parameter, found u8, but the type parameter is u8 gewesen.

jedoch die Auswahl Bibliothek (Versionen 0.2.2 und 0.3.0), einen Fehler zu haben scheint:

vom Iterator zurück
impl<'a> Selection<'a> { 
    fn iter(&'a self) -> Iter<'a>; 
} 

Dies zwingt die Werte ein Leben lang an die Selection Struktur gebunden zu haben, nicht die Document.

Dies scheint have been fixed jetzt:

impl<'a> Selection<'a> { 
    pub fn iter<'sel>(&'sel self) -> Iter<'sel, 'a>; 
} 

Aber das Update ist nicht freigegeben, so dass Sie nichts außer Fehler der Maintainer tun können, eine neue Version zu veröffentlichen, oder Sie können die Bibliothek aus verwenden, wählen das Git-Repository.

+0

Das hilft, danke! Ich habe den "falschen" Knoten entfernt und werde versuchen, von einer festen Auswahlquelle zu bauen. Sich Notizen machen, um Fragen besser zu präsentieren! – pithonsmear

Verwandte Themen