Lifetimes
On dispose d'une liste de comptes sous la forme d'un vecteur d'éléments de type Account
dans la variable accounts
. Lorsqu'on cherche à les grouper, on retourne une table de hashage (HashMap
) indexée par des String
et contenant des vecteurs de String
, c'est-à-dire qu'une copie des données contenues dans account
est effectuée. Ne pourrait-on pas faire mieux ? Tant que accounts
existe, ne pourrait-on pas pointer simplement sur les chaînes de caractères contenues dans ce vecteur ?
Changement de signature de Account::group()
On souhaite changer la signature de Account::group()
pour qu'elle devienne
pub fn group(accounts: &[Account]) -> HashMap<&str, Vec<&str>> { … }
ce qui correspond, en appliquant les règles d'élisions, à :
pub fn group<'a>(accounts: &'a [Account]) -> HashMap<&'a str, Vec<&'a str>> { … }
Autrement dit, les données dans la table de hashage et la table de hashage elle-même ne seront accessibles que tant que la variable accounts
passée en argument de group()
sera valable. Cela est garanti à la compilation et il sera impossible de s'en affranchir.
- Changez la définition de
group()
pour correspondre à celle indiquée ci-dessus ainsi que son contenu. - Adaptez le programme principal pour qu'il passe une référence sur
accounts
àgroup()
au lieu de consommer la variable.
Après ces modifications, plus aucune copie de chaîne n'a lieu lors de la détermination des duplicatas. Les seules copies sont des copies de références, c'est-à-dire de pointeurs assorties de tailles. De plus, le vecteur accounts
initial n'a pas été consommé, juste référencé, ce qui signifie qu'on pourra faire des opérations complémentaires sur les comptes originels.