Ich werde Ihnen zeigen, wie Sie Python-ähnliche Bereiche mit Rust verwenden.
Es kann wie folgt verwendet werden.
// 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);
}
Sie können einen Python-ähnlichen Bereich mit den folgenden Makros implementieren.
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)
};
}
Grundsätzlich wird der gleiche Iterator wie bei der Python-Bereichsfunktion zurückgegeben.
Wenn Sie einen negativen Schritt angeben, kann "step_by ()" nur "usize" empfangen, daher müssen Sie den Iterator mit "rev ()" umkehren. Daher wird das Vorhandensein oder Fehlen von "-" durch Mustervergleich beurteilt, und es wird entschieden, ob "rev ()" ausgeführt werden soll. Wenn eine Variable eine negative Zahl enthält und als Schritt angegeben wird, kann sie daher nicht durch Mustervergleich als negative Zahl bestimmt werden, was zu einem Kompilierungsfehler führt.
//Kompilierungsfehler
let x = -1;
for i in range!(5, 1, x) {
println!("{}", i);
}
Ich würde gerne wissen, ob es einen Weg gibt, dies gut umzusetzen.
Rostmakros haben viel Freiheit, also macht es viel Spaß.
Recommended Posts