为什么我可以毫无问题地运行以下语句?

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
...

Rust相关问答推荐

使用nom将任何空白、制表符、白线等序列替换为单个空白

在Tauri中获取ICoreWebView 2_7以打印PDF

为什么迭代器上的`. map(...)`的返回类型如此复杂?

Tauri tauri—apps/plugin—store + zustand

在泛型 struct 的字段声明中访问关联的Conant

抽象RUST中的可变/不可变引用

如何实现泛型枚举的`Serde::Desialize`特性

如何编写一个以一个闭包为参数的函数,该函数以另一个闭包为参数?

原始数组数据类型的默认trait实现

程序在频道RX上挂起

如何获取光标下的像素 colored颜色 ?

在为第三方 struct 实现第三方特征时避免包装器的任何方法

Rust Redis 中的 HSET 命令问题

从 HashMap>, _> 中删除的生命周期问题

LinkedList::drain_filter::drop 中 DropGuard 的作用是什么?

在 Rust 中如何将值推送到枚举 struct 内的 vec?

Rustlings 切片原语

在 Rust 中返回对枚举变体的引用是个好主意吗?

需要括号的宏调用中的不必要的括号警告 - 这是编写宏的糟糕方法吗?

函数参数的 Rust 功能标志