Я пытаюсь передать функцию-конструктор в качестве аргумента другой функции. Функция создает структуру со связанным временем жизни. Мне нужно создать структуру из этого указателя после того, как я создал некоторые другие объекты, которые эта структура может ссылаться. Пример, приведенный ниже, кажется, работает:
struct Bar<'a> {
number: Option<&'a usize>,
}
impl<'a> Bar<'a> {
pub fn new() -> Bar<'a> {
Bar { number: None }
}
}
fn foo<'a, F>(func: &F)
where
F: Fn() -> Bar<'a>,
{
let number = 42;
let mut bar = (func)();
bar.number = Some(&number);
}
fn main() {
foo(&Bar::new);
}
Когда я добавляю Cell
для внутренней изменчивости, тогда он не компилируется:
use std::cell::Cell;
struct Bar<'a> {
number: Cell<Option<&'a usize>>,
}
impl<'a> Bar<'a> {
pub fn new() -> Bar<'a> {
Bar {
number: Cell::new(None),
}
}
}
fn foo<'a, F>(func: &F)
where
F: Fn() -> Bar<'a>,
{
let number = 42;
let bar = (func)();
bar.number.set(Some(&number));
}
fn main() {
foo(&Bar::new);
}
Предоставляя мне следующую ошибку:
error[E0597]: 'number' does not live long enough
--> src/main.rs:21:26
|
21 | bar.number.set(Some(&number));
| ^^^^^^ borrowed value does not live long enough
22 | }
| - borrowed value only lives until here
|
note: borrowed value must be valid for the lifetime 'a as defined on the function body at 15:1...
--> src/main.rs:15:1
|
15 | / fn foo<'a, F>(func: &F)
16 | | where
17 | | F: Fn() -> Bar<'a>,
18 | | {
... |
21 | | bar.number.set(Some(&number));
22 | | }
| |_^
Почему первый пример работал, а не второй? Есть ли способ указать время жизни, которое существует для области, let mut bar
до конца функции, а не 'a
которая охватывает всю функцию? Не возможно ли это без создания без лексических времен или более высокого типа конструкторов и т.д.?