【发布时间】:2012-03-05 12:44:15
【问题描述】:
文档没有说明如何和教程完全忽略 for 循环。
【问题讨论】:
文档没有说明如何和教程完全忽略 for 循环。
【问题讨论】:
let range = (start..end).collect::<Vec<i32>>();
【讨论】:
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),但提交了a pull request 来解决此问题。
【讨论】:
从 1.0 开始,for 循环使用 Iterator trait 类型的值。
本书在chapter 3.5 和chapter 13.2 中描述了这种技术。
如果您对 for 循环的运行方式感兴趣,请参阅 Module std::iter 中描述的语法糖。
例子:
fn main() {
let strs = ["red", "green", "blue"];
for sptr in strs.iter() {
println!("{}", sptr);
}
}
如果您只想迭代一个数字范围,如在 C 的 for 循环中,您可以使用 a..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 i in (0..3).rev() { // Code here... } 参考:doc.rust-lang.org/book/ch03-05-control-flow.html
i 变成u8?我做了for i: u8 in 0..26 {,但它不起作用。
实际上,本教程的Loops 部分确实涵盖了for 循环:
在对向量进行迭代时,请改用
for。for elt in ["red", "green", "blue"] { std::io::println(elt); }
但如果您需要索引,您可以使用 uint::range function from the core library(或 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];
}
【讨论】:
fn(args...) 而不是 |args| 来节省编码器的麻烦。
{|args| body} 用于表示闭包而不仅仅是一个函数。这对于简化匿名函数的使用也非常方便,因为您可能会看到它们在 Javascript 中使用,因为任何接受闭包作为其最后一个参数的函数(例如回调)都可以在函数调用 之后编写,如上面 Lindsey 的第三个示例。最后,尽管 Rust 有几种不同类型的闭包,但 Rust 可以在使用块语法时推断出你想要的闭包类型。另见doc.rust-lang.org/doc/tutorial.html#closures
请注意,从 rustc 0.4(2012 年 10 月)开始,
range(0u, 64u) {|i|
C[i] = A[i] + B[i];
}
似乎不再受支持。
【讨论】:
使用int::range。
【讨论】: