Я пытаюсь вернуть срез из вектора, который встроен в мою функцию. Очевидно, это не работает, потому что срок службы v
истекает слишком рано. Мне интересно, есть ли способ продлить срок службы v
. Я хочу вернуть простой срез, а не вектор.Увеличьте время жизни переменной
ответ
Вы не можете принудительно продлить срок службы значения; вам просто нужно вернуть полный номер 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
.
- 1. Увеличьте время жизни переменной для потока
- 2. Увеличьте время жизни объекта и время жизни резьбы
- 3. Увеличьте время жизни диапазона для boost :: filter
- 4. время жизни постоянной переменной?
- 5. Rails время жизни переменной params
- 6. Привязывание признака переменной продолжительности жизни до & само время жизни
- 7. Время жизни локальной переменной в Java
- 8. Время жизни переменной в шаблоне поиска
- 9. Что такое время жизни переменной внутри блока?
- 10. время жизни статической переменной в функции
- 11. Константа переменной и ее время жизни
- 12. Объем Java и время жизни переменной
- 13. Объем или время жизни переменной в C
- 14. Время жизни переменной константной ссылке не распространяется
- 15. Когда требуется время жизни?
- 16. статическое время жизни
- 17. Как установить время жизни возвращаемого значения как время жизни переменной, которую я перемещаю в нее?
- 18. Увеличьте время отклика сервера
- 19. Увеличьте время загрузки страницы
- 20. Codeigniter Увеличьте время выполнения
- 21. Увеличьте время цикла SQL?
- 22. iife javascript переменное время жизни
- 23. RequestLocationUpdates Время жизни
- 24. Время жизни Java HttpSession
- 25. structuremap objectfactory время жизни
- 26. UIGraphicsGetCurrentContext() короткое время жизни
- 27. Время жизни объекта
- 28. Время жизни экземпляра сервлета
- 29. Время жизни объекта NSNotification
- 30. C++ переменное время жизни
Я хотел вернуть список только для чтения. Я предполагаю, что мне понадобится OwnedSlice, но это, вероятно, просто Vec. Я не могу вернуть итератор, потому что хочу, чтобы он был индексируемым. – SBSTP
Поскольку 'Vec' (или что-то еще) содержит' & Elements', фактическое содержимое списка имеет значение «только для чтения», как это было бы с '& []'. Возвращение 'Vec', а не' & [] 'эффективно позволяет пользователю изменять длину этого вектора (например, элементы' push'/'pop' из него), ограничение этого обычно не нужно, особенно в Rust, где' Vec и т. Д. Уникальны, поэтому изменение 'Vec' не изменяет никаких значений нигде. – huon
Кроме того, вы можете вернуть итератор: если пользователю абсолютно необходимо случайным образом получить доступ к нему более одного раза, тогда они могут вручную '.collect()'. Если они хотят только итерировать по порядку или индексировать случайным образом один раз (возможно через 'nth'), то возврат итератора, скорее всего, будет более эффективным, поскольку элементы будут генерироваться только по требованию. Конечно, если структура * обычно * случайным образом доступна, то требование «собирать» просто сделает вещи более подробными. (Я просто понял, что сделал ошибку с предложением итератора, как написано. Исправление.) – huon