链式方法
Rust是一种系统编程语言,就像C和C++一样,它的代码可以写成独立的命令,单独成行,但它也有函数式风格。两种风格都可以,但函数式通常比较短。下面以非函数式(称为 "命令式")为例,让Vec
从1到10。
fn main() { let mut new_vec = Vec::new(); let mut counter = 1; while counter < 11 { new_vec.push(counter); counter += 1; } println!("{:?}", new_vec); }
这个打印[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
。
而这里是函数式风格的例子:
fn main() { let new_vec = (1..=10).collect::<Vec<i32>>(); // Or you can write it like this: // let new_vec: Vec<i32> = (1..=10).collect(); println!("{:?}", new_vec); }
.collect()
可以为很多类型做集合,所以我们要告诉它类型。
用函数式可以链接方法。"链接方法"的意思是把很多方法放在一个语句中。下面是一个很多方法链在一起的例子。
fn main() { let my_vec = vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; let new_vec = my_vec.into_iter().skip(3).take(4).collect::<Vec<i32>>(); println!("{:?}", new_vec); }
这样就创建了一个[3, 4, 5, 6]
的Vec。这一行的信息量很大,所以把每个方法放在新的一行上会有帮助。让我们这样做,以使其更容易阅读。
fn main() { let my_vec = vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; let new_vec = my_vec .into_iter() // "iterate" over the items (iterate = work with each item inside it). into_iter() gives us owned values, not references .skip(3) // skip over three items: 0, 1, and 2 .take(4) // take the next four: 3, 4, 5, and 6 .collect::<Vec<i32>>(); // put them in a new Vec<i32> println!("{:?}", new_vec); }
当你了解闭包和迭代器时,你可以最好地使用这种函数式。所以我们接下来将学习它们。