我写这个是为了简单的输入解析:
use std::io;
fn main() {
let mut line = String::new();
io::stdin().read_line(&mut line)
.expect("Cannot read line.");
let parts = line.split_whitespace();
for p in parts {
println!("{}", p);
}
line.clear();
io::stdin().read_line(&mut line)
.expect("Cannot read line.");
}
上面的代码创建一个String
对象,读入一行,用空格分割它并打印输出。然后它尝试使用相同的String
对象做同样的事情。编译时出现错误:
--> src/main.rs:15:5
|
9 | let parts = line.split_whitespace();
| ---- immutable borrow occurs here
...
15 | line.clear();
| ^^^^ mutable borrow occurs here
...
19 | }
| - immutable borrow ends here
As由迭代器String
拥有。解决方案描述为:
let parts: Vec<String> = line.split_whitespace()
.map(|s| String::from(s))
.collect();
我在这里有几个问题:
- 我已经通过调用每个迭代器来消耗迭代器。它的借用应该已经结束了。
- 我如何从函数定义中知道借用的生命周期?
- 如果一个函数正在借用一个对象,我怎么知道它释放了它?例如,在使用
collect()
释放借用的解决方案中。
我想我在这里遗漏了一个重要的概念。