2014-06-08 3 views
3

Je rencontre des problèmes pour passer une Vec<u64> dans une fonction sans la déplacer. J'ai une fonction find_factors(mut n: u64, mut fctrs: Vec<u64>) et je fais appel actuellement de principal comme ceci:Passer un Vec dans une fonction par référence

fn main() { 
    let mut primeFactors: Vec<u64> = Vec::new(); 
    find_factors(1134 as u64, primeFactors); 
} 

Je suis forcé en ce moment à boucle et à imprimer mon vecteur dans la fonction find_factors parce que je ne suis pas sûr de savoir comment passer le Vec<u64> par référence au lieu de le déplacer. Comment pourrais-je accomplir cela? Exemple de ce que je veux faire:

fn main() { 
    let mut primeFactors: Vec<u64> = Vec::new(); 
    find_factors(1134 as u64, primeFactors); 

    //for .... 
     //print vector in main! 
} 
+0

Le style de nommage préféré, d'ailleurs, est 'prime_factors'. –

Répondre

9

Si vous n'avez pas besoin d'ajouter ou de supprimer des éléments du vecteur, tranche d'utilisation (&[T]) ou une tranche mutable (&mut [T]):

fn find_factors(n: u64, prime_factors: &mut [u64]) { ... } 

let mut prime_factors: Vec<u64> = Vec::new(); 
find_factors(1134 as u64, prime_factors.as_mut_slice()); 

tranches Immuable vous permettent de lire ou de créer des éléments sous-tranches; tranches mutables permettent en outre de modifier les éléments. Mais les tranches ne peuvent pas croître - elles sont juste une vue dans un vecteur.

Il semble que vous ayez besoin d'ajouter de nouveaux éléments au vecteur. Vous ne serez pas en mesure de le faire en utilisant la tranche, comme je l'ai dit; vous devez passer le vecteur lui-même en utilisant la référence mutable:

fn find_factors(n: u64, prime_factors: &mut Vec<u64>) { 
    // here you can call e.g. prime_factors.push(...) 
} 

let mut prime_factors: Vec<u64> = Vec::new(); 
find_factors(1134 as u64, &mut prime_factors); 
+1

En essayant d'apprendre la rouille, j'ai une question concernant votre dernier échantillon: Ne serait-il pas mieux/plus idiomatique de passer le Vec par valeur et de le retourner, sans le &? Comme le Vec alloue ses données sur le tas, il devrait lui-même être très petit à droite? – Tomas

+0

@Tomas vous avez absolument raison de dire que le fait de passer un 'Vec' par valeur est très bon marché - il se compose de trois valeurs de taille pointeur. Cependant, je ne pense pas que le passage en valeur ici serait idiomatique. Après tout, le passage par une référence mutable est strictement plus général: si vous avez un 'Vec ' par valeur, vous pouvez toujours créer un '& mut Vec ', mais si vous avez seulement '& mut Vec ', vous ne pourra pas "extraire" 'Vec ' de lui facilement. –

+0

Merci Vladimir. Bon point. – Tomas

0

Utilisez primeFactors.as_slice() (ou primeFactors.as_mut_slice() si vous souhaitez modifier le contenu du vecteur en place) pour passer un vecteur comme un pointeur emprunté.

Modifiez votre fonction pour accepter une tranche empruntée de type &[T].

Questions connexes