web-dev-qa-db-fra.com

Comment faites-vous une gamme dans la rouille?

Les docs ne disent pas comment, et le tutoriel ignore complètement pour les boucles.

28
mcandre

À partir de 1.0, pour les boucles fonctionnent avec des valeurs de types avec le Iterator trait .

Le livre décrit cette technique dans chapitre 3.5 et chapitre 13.2 .

Si vous êtes intéressé par la manière des boucles, consultez le sucre syntaxique décrit ici:

http://doc.rust-lang.org/std/iter/index.html

Exemple:

fn main() {
    let strs = ["red", "green", "blue"];

    for sptr in strs.iter() {
        println!("{}", sptr);
    }
}

(- terrain de je )

Si vous souhaitez simplement itération sur une gamme de chiffres, comme dans les boucles for, vous pouvez créer une plage numérique avec le a..b Syntaxe:

for i in 0..3 {
    println!("{}", i);
}

Si vous avez besoin à la fois, l'index et l'élément d'un tableau, le moyen idiomatique de l'obtenir avec le Iterator::enumerate Méthode:

fn main() {
    let strs = ["red", "green", "blue"];

    for (i, s) in strs.iter().enumerate() {
        println!("String #{} is {}", i, s);
    }
}

Remarques:

  • Les éléments de boucle sont empruntés des références aux éléments iTRETE. Dans ce cas, les éléments de strs ont le type &'static str - Ils sont empruntés sur des cordes statiques. Cela signifie sptr a type &&'static str donc nous la déréférences comme *sptr. Une forme alternative que je préfère est:

    for &s in strs.iter() {
        println!("{}", s);
    }
    
23
nejucomo

En fait, la section boucles du tutoriel couvre for boucles:

Lorsque vous itérant sur un vecteur, utilisez for à la place.

for elt in ["red", "green", "blue"] {
   std::io::println(elt);
}

Mais si vous aviez besoin de indices, vous pouvez faire quelque chose comme ce qui suit, en utilisant le uint::range fonction de la bibliothèque principale (ou int::range ou u8::range ou u32::range ou u64::range) et la syntaxe de rouille pour les blocs:

range(0u, 64u, {|i| C[i] = A[i] + B[i]});

La rouille utilisée pour prendre en charge cette syntaxe équivalente, mais il a été supprimé par la suite:

range(0u, 64u) {|i|
    C[i] = A[i] + B[i];
}
11
Lindsey Kuper

for i in range(0, 100) est maintenant obsolète en faveur de for i in 0..100 (selon rustc 1.0.0-nightly.

Vaut également la peine d'être noté, le compilateur ne peut pas être désambigué lorsque vous utilisez un identifiant dans la plage (par exemple, for i in 0..a) Vous devez donc utiliser for i in (0..a), mais il y a ne demande de traction Soumis pour résoudre ce problème.

10
confused00

Notez qu'à partir de Rusc 0,4 (oct. 2012), la construction alternative de

range(0u, 64u) {|i|
    C[i] = A[i] + B[i];
}

semble ne pas être pris en charge.

2
Bob Hansen

Utilisez int :: plage .

0
mcandre