Всякий раз, когда есть ссылка в Rust, есть целая жизнь.В большинстве случаев компилятор может сделать вывод, что вам не нужно записывать его, но он все еще там.Когда вы получаете запутанные ошибки времени жизни, это помогает попытаться выяснить, каковы эти неявные времена жизни.
fn foo(b: Box<DoSomthing<&i32>>) {
let s = 123;
b.do_sth(&s);
}
Это эквивалентно
fn foo<'y>(b: Box<DoSomthing<&'y i32>>) {
let s = 123;
b.do_sth(&s);
}
Другими словами, время жизниссылка, переданная на do_sth
, на самом деле является "тем, что хочет вызывающий foo
".Эта сигнатура функции позволяет мне написать следующее:
fn main() {
let b : Box<DoSomthing<&'static i32>> = Box::new(&3);
foo(b);
}
И если вы расширите черту DoSomthing
для этого параметра, вы получите следующую функцию:
fn do_sth(&self, value: &'static i32) {
println!("{:?}", value);
}
, которая foo
пытается вызвать со ссылкой на локальную переменную.
Я надеюсь, это объясняет, почему ваш код не работает.
Что касается того, что вы должны написать вместо этого, я думаю, что это не такдействительно отвечает в целом.Невозможно написать подпись do_sth
таким образом, чтобы «все ссылки, переданные этой функции, могли быть временными».Вам придется взглянуть на свой реальный код и придумать лучший способ его написания.