Je suis en train d'écrire un conteneur pour les objets de type T
qui donne accès à des références &T
aux objets stockés (je veux éviter de faire des copies). Comme le conteneur ne cesse de croître au cours de sa durée de vie, la durée de vie des références renvoyées &T
doit être la même que celle du conteneur.Existe-t-il un moyen idiomatique de conserver des références à des éléments d'un conteneur en croissance constante?
Le plus proche que j'ai eu jusqu'à présent était d'utiliser Box<T>
objets en interne dans mon conteneur et d'utiliser Box<T>.as_ref()
pour renvoyer des références à ces objets. Ensuite, cependant, je rencontre le même problème que dans cet exemple minimal:
fn main() {
let mut v = vec![Box::new(1)]; // line 1
let x = v[0].as_ref(); // line 2: immutable borrow occurs here
println!("x = {:?}", x); // line 3
v.push(Box::new(2)); // line 4: mutable borrow occurs here -> error
println!("x = {:?}", x); // line 5
}
Je comprends que ce ne serait pas correct d'utiliser x
dans la ligne 5 si elle avait été supprimée au cours de la v
l'emprunt mutable. Mais ce n'est pas le cas ici, et ce ne sera jamais pour mon conteneur. S'il n'y a pas de moyen sûr d'exprimer cela dans Rust, comment pourrais-je "réparer" l'exemple (sans copier x
)?
Je suis au courant de réallocation potentiel invalidant les références aux éléments du Vec. C'est pourquoi j'ai utilisé Vec>: les références à la case sont instables, mais les références au T sont stables, n'est-ce pas? Après tout, Vec > ne nécessite pas la boîte pour être clonable, donc il ne peut pas invalider les références à la T. –
chs
À ce stade, ce que vous voulez vraiment est 'Rc', parce que c'est littéralement la définition d'une référence partagée partagée dans Rust –
Le Vec est le (seul) propriétaire du pointeur, donc le comptage de référence n'est pas ce que je veux . Il est parfaitement acceptable que les références soient invalidées une fois la durée de vie de la Vec propriétaire terminée. (Je suis d'accord que le comptage des références éviterait tout le problème de propriété, mais je veux que les références soient aussi légères que possible pour des raisons de performance.) – chs