我写了这个简单的输入解析:如何知道什么时候借结束
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
由于String
是owned by an iterator。该解决方案被描述为:
let parts: Vec<String> = line.split_whitespace()
.map(|s| String::from(s))
.collect();
我有几个问题在这里:
- 我已经通过调用每个在它消耗的迭代器。它的借款应该已经结束。
- 如何从函数定义中知道借用的生命期?
- 如果一个函数是借用一个对象,我怎么知道它释放它?例如在解决方案中使用
collect()
释放借入。
我想我在这里错过了一个重要的概念。
请仅发布[每个问题一个问题](https://meta.stackexchange.com/q/39223/281829)。 – Shepmaster
这些是与相同概念相关的相关问题,因此发布三个单独的问题并不会富有成效。 – Xolve