为什么我可以毫无问题地运行以下语句?
println!("{:?}", (vec!["1".to_string(), "1".to_string(), "1".to_string()]).iter().collect::<Vec<&String>>());
如果我理解正确的话,它创建一个拥有的Strings数组,Get是一个字符串引用的迭代器,然后收集一个字符串引用的array.但这些引用引用了在该语句开头不再存在的array.为什么它能起作用?
为什么我可以毫无问题地运行以下语句?
println!("{:?}", (vec!["1".to_string(), "1".to_string(), "1".to_string()]).iter().collect::<Vec<&String>>());
如果我理解正确的话,它创建一个拥有的Strings数组,Get是一个字符串引用的迭代器,然后收集一个字符串引用的array.但这些引用引用了在该语句开头不再存在的array.为什么它能起作用?
生命周期 延长到statement的末尾(即分号),而不是.iter()
的末尾.
当您将这段代码拆分为两个语句时,编译器会解释这一点.
在the Rust Reference年里,我们发现了这个:
除了生存期扩展之外,表达式的临时作用域是包含该表达式的最小作用域,并且是以下范围之一:
- 整个函数体.
- 一份声明.
- IF、WHILE或循环表达式的主体.
- If表达式的Else块.
- IF或WHILE表达式或匹配保护的条件表达式.
- 表示匹配手臂的表达式.
- 懒惰布尔表达式的第二个操作数.
在这种情况下,最小的作用域是语句.
fn main() {
let v = (vec!["1".to_string(), "1".to_string(), "1".to_string()])
.iter()
.collect::<Vec<&String>>(); // !!! ERROR
println!("{:?}", v);
}
...
4 | .collect::<Vec<&String>>();
| - temporary value is freed at the end of this statement
...