L'utilisation de déplacé valeurs
Je suis en train de calculer la 10,001 st le premier à Rust (Projet Euler 7), et comme une partie de cela, ma méthode pour vérifier si un entier est premier fait référence à un vecteur. Cependant, lorsque j'essaie de référence du vecteur, j'obtiens l'erreur suivante:
error: use of moved value: `primes`
note: `primes` was previously moved here because it has type `collections::vec::Vec<u64>`, which is non-copyable
error: use of moved value: `primes`
error: aborting due to 2 previous errors
Mon code source est ci-dessous:
fn main(){
let mut count: u32 = 1;
let mut num: u64 = 1;
let mut primes: Vec<u64> = Vec::new();
primes.push(2);
while count < 10001{
num += 2;
if vectorIsPrime(num, primes){
count+=1;
primes.push(num);
}
}
}
fn vectorIsPrime(num: u64, p: Vec<u64>) -> bool{
for i in p{
if num > i && num % i != 0{
return false;
}
}
true
}
Que dois-je faire pour primes
afin d'être en mesure d'accéder à l'intérieur de la vectorIsPrime
fonction?
Aussi, ceux qui cherchent à l'utiliser pour les aider dans leur projet d'Euler problème de la Rouille, j'ai fait une erreur dans mon
Vous pourriez avoir édité la question, au lieu de commenter. Je l'ai juste fait pour vous.
Merci. J'ai pensé commentaire, depuis ma question du code a été brisé pour commencer. En commentant, les gens peuvent voir que c'est un problème dans les réponses ci-dessous.
Permettez-moi de résoudre la question 😉
vectorIsPrime
méthode, il faut lire if num > i && num % i == 0
plutôt que if num >= i && num % i != 0
Vous pourriez avoir édité la question, au lieu de commenter. Je l'ai juste fait pour vous.
Merci. J'ai pensé commentaire, depuis ma question du code a été brisé pour commencer. En commentant, les gens peuvent voir que c'est un problème dans les réponses ci-dessous.
Permettez-moi de résoudre la question 😉
OriginalL'auteur mjkaufer | 2015-03-01
Vous devez vous connecter pour publier un commentaire.
Avec la définition actuelle de votre fonction
vectorIsPrime()
, la fonction spécifie qu'il nécessite de la propriété du paramètre parce que vous passer en valeur.Lorsqu'une fonction nécessite un paramètre par valeur, le compilateur se chargera de vérifier si la valeur peut être copié en vérifiant si elle met en œuvre le trait
Copy
.C'est le sens du message d'erreur que vous avez.
Cependant, la plupart des fonctions ne nécessitent pas la propriété de l'paramètres: ils peuvent travailler sur le "emprunté références", ce qui signifie qu'ils ne possèdent pas réellement de la valeur (et ne peut pas par exemple le mettre dans un conteneur ou de la détruire).
La fonction
vector_is_prime()
précise maintenant qu'il a seulement besoin d'un tranche, c'est à dire un emprunt pointeur vers un tableau (y compris sa taille) que vous pouvez obtenir à partir d'un vecteur à l'aide de l'emprunter de l'opérateur & (c'est récent dans la Rouille, vous pouvez toujours trouver des exemples où un méthode .as_slice() est appelée explicitement)Pour plus d'informations sur la propriété, je vous invite à lire la partie de l'ouvrage traite avec la propriété.
i
dansfor &i in p{
besoin d'un&
en face de lui? Le code génère une erreur de compilation sans elle, et je suis curieux de savoir pourquoi.cela signifie que
i
est une référence, et par conséquent, dans la boucle, je vais être la valeur, plutôt qu'une référence. si vous le laissez, vous auriez besoin d' *i quand on fait des comparaisons.OriginalL'auteur Vaelden
La rouille est, je dirais, une “valeur” axée sur la langue. Cela signifie que si vous définissez des nombres premiers comme ce
c'est pas une référence à un vecteur. Il est pratiquement une variable qui stocke un valeur de type
Vec<u64>
comme toutu64
variable stocke unu64
valeur. Cela signifie que si vous passez à une fonction définie comme cecila fonction sera d'obtenir son propre
u64
valeur et de sa propreVec<u64>
valeur.La différence entre
u64
etVec<u64>
cependant que l'u64
valeur peut être facilement copié à un autre endroit tout en unVec<u64>
valeur ne peut déplacer à un autre endroit facilement. Si vous voulez donner lavec_is_prime
fonction de ses propresVec<u64>
valeur, tout en gardant un pour vous-même dans la principale, vous avez le reproduire, en quelque sorte. C'est ce qui estclone()
est pour. La raison pour laquelle vous devez être explicite ici, c'est parce que cette opération n'est pas bon marché. C'est une belle chose à propos de la Rouille: Il n'est pas difficile de repérer des opérations coûteuses. Donc, vous pourrait appeler la fonction comme cecimais ce n'est pas vraiment ce que vous voulez, en fait. La fonction n'a pas besoin de son propre
Vec<64>
valeur. Il a juste besoin de l'emprunter pour une courte durée. L'emprunt est beaucoup plus efficace et applicable dans ce cas:Invoquant il exige maintenant que les “emprunts opérateur”:
Beaucoup mieux. Mais nous pouvons encore l'améliorer. Si une fonction veut emprunter un
Vec<T>
juste pour le but de la lecture, il est préférable de prendre un&[T]
à la place:C'est juste plus général. Maintenant, vous pouvez prêter une certaine partie de la Cve, à la fonction ou tout autre chose (pas nécessairement un
Vec
, tant que ce quelque chose stocke ses valeurs consécutivement en mémoire, comme un statique de la table de recherche). Ce qui est aussi bien c'est qu'en raison encore de la contrainte des règles que vous n'avez pas besoin de modifier quoi que ce soit au site d'appel. Vous pouvez toujours appeler cette fonction avec&primes
comme argument.Pour
String
et&str
la situation est la même.String
est pour stocker des valeurs de chaîne dans le sens qu'une variable de ce type possède cette valeur.&str
est pour emprunter.i
, doit être écrit&i
.C'est une possibilité, oui. Une autre serait de déréférencer
i
où vous l'utilisez.Une itération sur un emprunt tranche vous donne emprunte des éléments. Faire autrement serait d'exiger le type de l'élément à être
Copy
ouClone
. Si vous utilisez&i
dans la boucle for,i
sera une copie d'un vecteur de l'élément.OriginalL'auteur sellibitze
Vous déplacer valeur de
primes
à la fonctionvectorIsPrime
(BTW Rouille utilisationsnake_case
par convention). Vous avez d'autres options, mais le mieux est d'emprunter de vecteur au lieu de la déplacer:Et puis en passant référence:
OriginalL'auteur Hauleth