速成课第5节-练习解答
下面是上一节 Rust 速成课 “ 迭代器和闭包三规则” 中练习题的解决方案。
这篇文章是基于 FP 完成 Rust 教学系列的一部分。 如果你在博客之外阅读这篇文章,你可以在介绍文章的顶部找到这个系列中所有文章的链接。 也可订阅 RSS 频道。
练习1
fn double(x: &mut u32) {
*x *= 2;
}
fn main() {
let mut x = 5;
double(&mut x);
println!("{}", x);
}注意,变量 x 不需要是可变的,因为我们只修改它引用的值。
练习2
(IMO)直截了当的解决办法是:
struct InfiniteUnit;
impl IntoIterator for InfiniteUnit {
type Item = ();
type IntoIter = InfiniteUnitIter;
fn into_iter(self) -> Self::IntoIter {
InfiniteUnitIter
}
}
struct InfiniteUnitIter;
impl Iterator for InfiniteUnitIter {
type Item = ();
fn next(&mut self) -> Option<()> {
Some(())
}
}
fn main() {
let mut count = 0;
for _ in InfiniteUnit {
count += 1;
println!("count == {}", count);
if count >= 5 {
break;
}
}
}但是,如果你想更聪明一点,在标准库中已经有一个函数可以创建一个无限迭代器,叫做 repeat。 使用它,您可以绕过这里的额外结构:
练习3
闭包版本:
函数版本:
因为 say_hi 不引用局部作用域中的任何变量,所以它不需要是闭包。
练习4
练习5
我们得到的第一个错误消息是:
看来我们需要一个迭代器了。 我们有三种不同的选择: into_iter()、 iter() 和 iter_mut ()。 由于我们需要多次使用结果,并且不需要任何变异,iter() 似乎是正确的选择。 一旦我们用 nums.iter () 替换nums.iter().map,我们可以进入 unimplemented!() 位。
我们需要一个数字翻倍的结局。 这很简单: | x | x * 2。 把这个放进去就行了! 额外的挑战: 闭包是 FnOnce,FnMut,还是 Fn?
练习6
您需要在 create 调用上添加一个 .unwrap()调用:
这样,您将收到来自编译器的警告,告知您已忽略来自 write_all 的 Result。 这是不好的做法,编译器理应会向您大喊大叫。 您可以使用unwrap() 修复该问题。 但是,这也是一种不好的做法:)。
练习7
最后更新于
这有帮助吗?