For loop 如何在生锈的情况下进行反向订购?
编者按:这个问题是在Rust 1.0发布之前提出的,并且引入了For loop 如何在生锈的情况下进行反向订购?,for-loop,rust,For Loop,Rust,编者按:这个问题是在Rust 1.0发布之前提出的,并且引入了。“range”操作符。问题的代码不再代表当前的样式,但下面的一些答案使用的代码将在Rust 1.0及更高版本中工作 我正在玩游戏,想把fizzbuzz倒过来打印出来。以下是我尝试过的: fn main() { // `n` will take the values: 1, 2, ..., 100 in each iteration for n in std::iter::range_step(100u, 0, -1)
。
“range”操作符。问题的代码不再代表当前的样式,但下面的一些答案使用的代码将在Rust 1.0及更高版本中工作
我正在玩游戏,想把fizzbuzz倒过来打印出来。以下是我尝试过的:
fn main() {
// `n` will take the values: 1, 2, ..., 100 in each iteration
for n in std::iter::range_step(100u, 0, -1) {
if n % 15 == 0 {
println!("fizzbuzz");
} else if n % 3 == 0 {
println!("fizz");
} else if n % 5 == 0 {
println!("buzz");
} else {
println!("{}", n);
}
}
}
没有编译错误,但它没有打印任何内容。如何从100迭代到1
编者按:这个问题指的是锈迹1.0之前的锈迹部分。查看其他答案以获取最新代码
您的代码不工作,因为值为-1的uint
等于uint的最大值。检测到溢出后,范围_步迭代器立即停止。使用int可以解决这个问题
std::iter::range_step(100i, 0, -1)
还可以使用rev()
反转迭代器
但是请注意,这将是从99->0开始的,而不是从100->1开始的。前向循环如下所示:
for x in 0..100 {
println!("{}", x);
}
通过调用以反转顺序来完成反向循环:
for x in (0..100).rev() {
println!("{}", x);
}
那么为什么编译器没有抱怨混合了类型?@user1452670:你没有混合类型,
100u
是类型uint
,0
和-1
是编译器将推断类型的非类型积分。这里,range\u步骤
需要统一的参数并接收(uint,)
,因此编译器推断它们都是uint
。如果您指定了0i
,或-1i
,则可能存在不匹配。@MatthieuM.:公平地说,-1
的值是编译器已知的,可以“推断”其类型为uint
,以产生警告,因为它不可表示。问题是,这是否是一个错误的频率。@sellibitze:当然,可以诊断超出范围的分配的lint是非常受欢迎的。@sellibitze:有一些。在rust中,0..10表示从0到9,10不包括在内。(0..10).rev()的意思是“10比1”还是“9比0”?括号有助于澄清这一点。首先计算范围(0到9),然后反向计算范围(9到0)。
for x in (0..100).rev() {
println!("{}", x);
}