文档没有说明如何和教程完全忽略 for 循环。
6 回答
从 1.0 开始,for循环使用具有Iterator
trait的类型的值。
本书在第 3.5 章和第 13.2 章中描述了这种技术。
如果您对for循环的操作方式感兴趣,请参阅模块 std::iter中描述的语法糖。
例子:
fn main() {
let strs = ["red", "green", "blue"];
for sptr in strs.iter() {
println!("{}", sptr);
}
}
(游乐场)
如果您只想迭代一个数字范围,就像在 C 的fora..b
循环中一样,您可以使用以下语法创建一个数字范围:
for i in 0..3 {
println!("{}", i);
}
如果您需要数组中的索引和元素,则惯用的方法是使用以下Iterator::enumerate
方法:
fn main() {
let strs = ["red", "green", "blue"];
for (i, s) in strs.iter().enumerate() {
println!("String #{} is {}", i, s);
}
}
笔记:
循环项是对迭代元素的借用引用。在这种情况下,元素
strs
具有类型&'static str
——它们是指向静态字符串的借用指针。这意味着sptr
有类型&&'static str
,所以我们将其取消引用为*sptr
。我更喜欢的另一种形式是:for &s in strs.iter() { println!("{}", s); }
实际上,本教程的循环部分确实涵盖了for
循环:
迭代向量时,请
for
改用。for elt in ["red", "green", "blue"] { std::io::println(elt); }
但是,如果您需要索引,您可以使用uint::range
核心库中的函数(或int::range
或u8::range
或u32::range
或u64::range
)和 Rust 的块语法来执行以下操作:
range(0u, 64u, {|i| C[i] = A[i] + B[i]});
Rust 曾经支持这种等效语法,但后来被删除:
range(0u, 64u) {|i|
C[i] = A[i] + B[i];
}
for i in range(0, 100)
现在不赞成使用for i in 0..100
(根据rustc 1.0.0-nightly
.
另外值得注意的是,当您使用范围内的标识符(例如,for i in 0..a
)时,编译器无法消除歧义,因此您必须使用for i in (0..a)
,但是提交了一个拉取请求来解决此问题。
请注意,从 rustc 0.4(2012 年 10 月)开始,
range(0u, 64u) {|i|
C[i] = A[i] + B[i];
}
似乎不再支持。
let range = (start..end).collect::<Vec<i32>>();
使用int::range。