herhangi ömrü ile türlerine referansları üzerinde çalışabileceği bir kutulu kapatılması dönen bir fonksiyon yazmaya çalışıyorum kutulu. Belirli bir örneği yazarken her şey iyi çalışıyor. Ancak jenerik bir sürümü yazarken, ömür boyu problemlerle karşılaşıyorum. kapatma bunun daha uzun yaşamak için türü parametresi ihtiyacı nedenRanked Sürekli Bağlı ve kapanışları ömür sorunu
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| {})
}
Ben (depolama ya da bir şey yoktur ...) görmüyorum. Ve HRTB ile genel olmayan sürümü için çalışır, sadece genel sürümü ile çalışmak için mümkün olması gerektiğini hissediyor. Ben genel sürümünü kullanarak belirli bir sürümünü yazmaya çalışırsanız
Ayrıca, bir tür hatayı
// 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
bu işi yapmak konusunda herhangi bir fikir edinmek?
derleyici genel parametre verildiğinde kendiliğinden '' <'a> için eklemek görünmüyor. Herhangi bir tatmin edici açıklama almazsanız, bu soruna bir bağlantı göndermek isteyebilirsiniz: https://www.reddit.com/r/rust/, Rust geliştiricilerinin asılması daha olasıdır. –
Cevabım açıkçası yanlıştı, dolayısıyla onu sildim. Ama yorumunuz tam olarak ne demek istediğinizi açıklıyor: "Kapatma neden daha uzun yaşamak için type parametresine ihtiyaç duyduğunu anlamıyorum (depolama veya başka bir şey yok ...) Ve genel olmayan sürüm için çalışıyor HRTB ile, sadece jenerik versiyon ile çalışmasını sağlamak mümkün gibi hissediyor. " - @Vaelden – aSpex