Diciamo che ho una struct con un riferimento a esso, e un altro struct con un riferimento a tale struct, qualcosa di simile:Lifetimes e riferimenti a oggetti contenenti riferimenti
struct Image<'a> {
pixel_data: &'a mut Vec<u8>,
size: (i32, i32),
}
struct SubImage<'a> {
image: &'a mut Image<'a>,
offset: (i32, i32),
size: (i32, i32),
}
Le struct hanno interfacce quasi identiche, la differenza è che SubImage
regola i parametri di posizione in base al relativo offset prima di inoltrarli alle funzioni corrispondenti del riferimento Image
contenuto. Vorrei che queste strutture fossero per lo più intercambiabili, ma non riesco a capire come ottenere la vita giusta. Originariamente, stavo solo usando Image
, e potrebbe passare intorno agli oggetti in modo semplice, senza mai pasticciare in giro con prescrittori corso della vita:
fn main() {
let mut pixel_data: Vec<u8> = Vec::new();
let mut image = Image::new(&mut pixel_data, (1280, 720));
render(&mut image);
}
fn render(image: &mut Image) {
image.rect_fill(0, 0, 10, 10);
}
Poi ho creato SubImage
, e voleva fare le cose in questo modo:
fn render2(image: &mut Image) {
let mut sub = SubImage {
image: image, // line 62
offset: (100, 100),
size: (600, 400),
};
sub.rect_fill(0, 0, 10, 10);
}
questo, però, causa un errore di compilazione:
main.rs:62:16: 62:21 error: cannot infer an appropriate lifetime for automatic coercion due to conflicting requirements
il suggerimento del compilatore è quello di cambiare la firma a questo:
fn render2<'a>(image: &'a mut Image<'a>)
tuttavia, che proprio spinge il problema fino alla funzione che chiama render2
, e ha preso un &mut Image
. E questo è abbastanza fastidioso, dato che la funzione richiama alcuni strati in profondità, e non ho dovuto fare nulla di tutto ciò quando stavo usando la classe Image
(che ha anche un riferimento) e aggiustando gli offset in linea.
Quindi, prima di tutto, non capisco nemmeno perché sia necessario (devo ammettere che la mia comprensione della vita della ruggine è limitata). E in secondo luogo (la mia domanda principale), c'è qualcosa che posso fare aSubImage
per rendere non necessarie queste esplicite vite?
C'è qualche informazione ufficiale sui limiti di durata? Mi sembrano informazioni molto importanti, ma non l'ho visto da nessuna parte nel libro ufficiale o nelle specifiche. – Malcolm
In effetti, questa è una cosa importante e non credo di averlo visto nemmeno nella documentazione. Probabilmente vale la pena di creare un problema nel tracker dei problemi di Rust su questo. –