2015-03-02 4 views
3

Я пытаюсь вернуть срез из вектора, который встроен в мою функцию. Очевидно, это не работает, потому что срок службы v истекает слишком рано. Мне интересно, есть ли способ продлить срок службы v. Я хочу вернуть простой срез, а не вектор.Увеличьте время жизни переменной

ответ

3

Вы не можете принудительно продлить срок службы значения; вам просто нужно вернуть полный номер Vec. Если я могу спросить, почему вы хотите вернуть сам срез? Это почти всегда не нужно, так как Vec может быть дешево (как в смысле легкого синтаксиса, так и с низкой нагрузкой во время выполнения), принужденный к фрагменту.

В качестве альтернативы, вы можете вернуть итератор:

use std::iter; 

pub fn find<'a>(&'a self, name: &str) -> Box<Iterator<Item = &'a Element> + 'a> { 
    Box::new(self.iter_elements() 
     .filter(move |&elem| elem.name.borrow().local_name == name)) 
} 

На данный момент, вы должны будете использовать объект признака итератора, так как закрытие есть типы, которые безымянным.

NB. Я должен был изменить закрытие filter на захват за кадром (ключевое слово move), чтобы гарантировать, что он может быть возвращен, или же переменная name просто передала бы указатель закрытия в стек стека find и, следовательно, будет ограничена из оставляя find.

+0

Я хотел вернуть список только для чтения. Я предполагаю, что мне понадобится OwnedSlice, но это, вероятно, просто Vec. Я не могу вернуть итератор, потому что хочу, чтобы он был индексируемым. – SBSTP

+1

Поскольку 'Vec' (или что-то еще) содержит' & Elements', фактическое содержимое списка имеет значение «только для чтения», как это было бы с '& []'. Возвращение 'Vec', а не' & [] 'эффективно позволяет пользователю изменять длину этого вектора (например, элементы' push'/'pop' из него), ограничение этого обычно не нужно, особенно в Rust, где' Vec и т. Д. Уникальны, поэтому изменение 'Vec' не изменяет никаких значений нигде. – huon

+0

Кроме того, вы можете вернуть итератор: если пользователю абсолютно необходимо случайным образом получить доступ к нему более одного раза, тогда они могут вручную '.collect()'. Если они хотят только итерировать по порядку или индексировать случайным образом один раз (возможно через 'nth'), то возврат итератора, скорее всего, будет более эффективным, поскольку элементы будут генерироваться только по требованию. Конечно, если структура * обычно * случайным образом доступна, то требование «собирать» просто сделает вещи более подробными. (Я просто понял, что сделал ошибку с предложением итератора, как написано. Исправление.) – huon

Смежные вопросы