2017-01-26 16 views
1

У меня возникли проблемы с определением функции, которая возвращает вектор Node из выбранного ящика, v0.2.2. Я добавлял к этой функции, как я работал мой путь через сообщения об ошибках (с помощью других вопросов в Интернете), но я не могу понять, как присвоить переменную 'a пожизненных для возвращаемого значения:Как назначить время жизни при возврате результата документа :: find из ящика выбора?

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() {} 

ошибка я получаю

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 | { 
    |^

Как я могу назначить 'a жизни для вызова функции? Я попытался (неудачно) использовать переменные, но прочитал, что переменные, созданные внутри тела функции, могут вызвать проблемы, поэтому отказ от этого подхода. Я вырыл себе слишком далеко вниз по стволу зайца, и должна ли эта функция быть определена более простым способом?

+1

Примечание: вы не * назначаете * жизни, вы * документируете их. Вы можете думать об этом как о * создании * против * открытия *, или как шутка идет «Но если кислород был обнаружен в 1770 году, как люди дышали раньше?». Ключевое понимание заключается в том, что существуют времена жизни, назовите их или нет; и все, что вы делаете, называет их, чтобы лучше понять их отношения (и проверить их компилятор). Может быть, я должен быть товарным знаком? * Время жизни похоже на кислородный лакомый кусочек? Звучит лучше, чем буррито. –

ответ

3

Ваш основной проблемой является то, что вы определили общий тип, что тени на реальнуюNode:

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

Этот должен бы быть дубликатом Expected type parameter, found u8, but the type parameter is u8.

Однако выберите библиотеку (версии 0.2.2 и 0.3.0), как представляется, ошибка:

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

Это заставляет значения, возвращаемых итератор, чтобы иметь жизнь, привязанную к Selection структуре, а не Document.

Это, кажется, have been fixed Сейчас:

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

Но исправление не было выпущено, так что вы не можете делать ничего, кроме ошибки сопровождающего, чтобы выпустить новую версию, или вы можете использовать библиотеку из репозиторий git.

+0

Это помогает, спасибо! Я удалил «поддельный» узел и попытаюсь построить из источника фиксированного выбора. Принимая ментальные заметки для лучшего представления вопросов! – pithonsmear