Je vais vous montrer comment utiliser une plage de type Python avec Rust.
Il peut être utilisé comme suit.
// for i in range(5):
// print(i)
for i in range!(5) {
println!("{}", i);
}
// for i in range(1, 5):
// print(i)
for i in range!(1, 5) {
println!("{}", i);
}
// for i in range(1, 5, 2):
// print(i)
for i in range!(1, 5, 2) {
println!("{}", i);
}
// for i in range(5, 1, -1):
// print(i)
for i in range!(5, 1, -1) {
println!("{}", i);
}
Vous pouvez implémenter une plage de type Python avec les macros suivantes.
macro_rules! range {
($stop:expr) => {
0..$stop
};
($start:expr, $stop:expr) => {
$start..$stop
};
($start:expr, $stop:expr, -$step:expr) => {
($stop + 1..$start + 1).rev().step_by($step)
};
($start:expr, $stop:expr, $step:expr) => {
($start..$stop).step_by($step)
};
}
Il renvoie essentiellement le même itérateur que la fonction de plage Python.
Lorsque vous spécifiez une étape négative, step_by ()
ne peut recevoir que ʻusize, vous devez donc inverser l'itérateur avec
rev () `.
Par conséquent, la présence ou l'absence de "-" est jugée par correspondance de modèle, et il est décidé d'effectuer ou non "rev ()".
Par conséquent, si une variable contient un nombre négatif et est donnée comme une étape, elle ne peut pas être déterminée comme un nombre négatif par correspondance de modèle, ce qui entraîne une erreur de compilation.
//Erreur de compilation
let x = -1;
for i in range!(5, 1, x) {
println!("{}", i);
}
Je voudrais savoir s'il existe un moyen de bien mettre en œuvre cela.
Les macros Rust ont beaucoup de liberté, donc c'est très amusant.
Recommended Posts