Я пытаюсь написать функцию, возвращающую закрытую коробку, которая может работать с ссылками на типы с любым временем жизни . При написании конкретного экземпляра все работает нормально. Но при написании общей версии я сталкиваюсь с проблемами времени.Вышеуказанная черта Ограниченная продолжительность жизни и закрытие ящиков с закрытыми ящиками
struct Parameter<'a> {
s: &'a str,
}
fn main() {
let closure = generate_closure_gen();
let string = String::from("Hello World!");
let parameter = Parameter { s: &string }; // Error: string does not live long enough
closure(¶meter);
}
// This one works fine
// Desugared version for Box<Fn(&Parameter)>
fn generate_closure() -> Box<for <'a, 'r> Fn(&'r Parameter<'a>)> {
Box::new(|c: &Parameter| {})
}
// This one gives lifetime errors
fn generate_closure_gen<C>() -> Box<Fn(&C)> {
Box::new(|c: &C| {})
}
Я не понимаю, почему закрытие нужен параметр типа, чтобы жить дольше, чем (нет хранения или что-нибудь ...). И он работает для не-родовой версии с HRTB, просто кажется, что это должно быть возможно, чтобы он работал с общей версией.
Кроме того, если я пытаюсь написать конкретную версию с помощью универсальной версии, я получаю ошибку типа
// Desugared version for Box<Fn(&Parameter)>
fn generate_closure_2() -> Box<for <'a, 'r> Fn(&'r Parameter<'a>)> {
generate_closure_gen()
}
src/main.rs:22:5: 22:27 error: mismatched types:
expected `Box<for<'r, 'r> core::ops::Fn(&'r Parameter<'r>) + 'static>`,
found `Box<for<'r> core::ops::Fn(&'r _) + 'static>`
(expected concrete lifetime,
found bound lifetime parameter) [E0308]
src/main.rs:22 generate_closure_gen()
^~~~~~~~~~~~~~~~~~~~~~
src/main.rs:22:5: 22:27 help: run `rustc --explain E0308` to see a detailed explanation
Любую идею о том, как сделать эту работу?
Компилятор, по-видимому, не вставляет 'for <'a>' сам по себе, если задан общий параметр. Если вы не получите удовлетворительного объяснения, вы можете отправить ссылку на этот вопрос на https://www.reddit.com/r/rust/, где разработчики Rust чаще всего будут болтаться. –
Мой ответ был явно неправильным, поэтому я удалил его. Но ваш комментарий объясняет, что именно вы имеете в виду: «Я не понимаю, почему закрытие требует, чтобы параметр типа жил дольше, чем он (нет никакого хранилища или чего-то еще ...). И он работает для не-универсальной версии с HRTB, он просто чувствует, что должно быть возможно заставить его работать с общей версией ». - @ Валден – aSpex