io::stdin() 返回的是引用, 合并之后引用丢掉了, 后面无法再用lines读取了.
不是的,看它的签名
pubfn stdin()-> Stdin
可以知道返回的是一个叫Stdin的struct。
letmutlines=io::stdin().lock().lines();
这里io::stdin()是个临时变量。如果你这么写,lock()返回的StdinLock会拿着一个临时变量的引用,临时变量销毁后这个引用就变成悬空的了。
其实编译器也说得很清楚了。
error[E0716]: temporary value dropped while borrowed
--> src\main.rs:33:21
|
33 | let mut lines = std::io::stdin().lock().lines().map(
| ^^^^^^^^^^^^^^^^ creates a temporary which is freed while still in use
...
37 | );
| - temporary value is freed at the end of this statement
这个坑上次才看人在C++里踩过。
所以,撞墙和跳楼选一个吧:)let mut lines = stdin.lock().lines();
上面这个, 迭代器为什么要用mut修饰, 迭代器调用next()就是修改了吗? next()只是返回元素, 修改的也只是内部的一个指针, 迭代器还是那个迭代器啊? 我就搞不懂这个设计. 一箱苹果, 我说下一个苹果, 无论我说几遍, 这还是一箱苹果, 除非变成一箱橘子, 这才是变化, 不是吗?
next()不是返回元素,而是把指向当前元素的迭代器变成指向下一个元素的迭代器。这样想的话,要求mut就是很自然的事情了。
println!("{} said `{}`.",name,quote);
这样抓狂的时候还会有很多,祝愿你早日度过最初的这段时间。