Я могу обойти эту проблему, избегая замыканий (хотя я не очень понимаю, как a становится локальным по отношению к run_method - разве параметр времени жизни не должен выбираться вызывающей стороной?)
Это так. Но когда вы переписываете его без замыканий, вы также помещаете ссылку в вызов vec!
, поэтому он больше не создается во время выполнения. Вместо этого компилятор может сделать вывод, что to_test
имеет тип Vec<&'static i32>
, и, поскольку 'static
переживает любое время, выбранное вызывающим абонентом, нарушения не будет.
Это не скомпилируется, как вы ожидаете:
let to_test = vec![0i32];
for param in to_test.iter() {
let foo = Foo(param);
f(&foo);
}
есть ли причина, по которой это не должно работать?
Да, поскольку тип run
ограничен типом Foo
. Более конкретно, у вас есть время жизни, определенное вызывающей стороной (неявно, в типе для Foo
), поэтому вы должны сконструировать Foo
из , что продолжительности жизни, чтобы вызвать указанную ссылку run
на это.
Можно ли это исправить без переписывания?
Это зависит.
Если все ваши тестовые значения являются литералами, вы можете сделать 'static
ссылки.
Если вы можете и хотите переписать run
, можно сделать его неограниченным по типу Foo
impl<'a> Foo<'a> {
fn run<'s>(_self: &Foo<'s>) {
println!("Hello {}", _self.0);
}
}
Но тогда ему вообще не нужно входить в блок impl
.
Я думаю, что решение, предоставленное в комментариях, является лучшим выбором, поскольку, учитывая, что вам не нужен конкретный тип Foo<'a>
, нет необходимости указывать ссылку на метод для этого типа.