Rust中是否存在单行语法构造含临时值引用的结构体?
单行解决Rust中临时值被提前销毁的问题
首先得搞明白为啥原来的单行写法会报错:当你写Foo::new(&Bar::empty())时,Bar::empty()创建的是一个临时值,这个值会在当前语句结束后立即被销毁,但Foo还持有它的引用——这直接违反了Rust的核心规则:引用绝对不能比被引用的值活得久。
不过确实有办法把实例化过程压缩成一行,下面给你两个可行的方案:
方案1:元组模式绑定
用元组把Bar的创建和Foo的实例化合并到一行,Rust会按顺序处理元组元素,保证Bar实例的生命周期覆盖Foo:
fn main() { let (bar, foo) = (Bar::empty(), Foo::new(&bar)); println!("{}", foo.bar.value); }
这里会先创建拥有所有权的bar实例,再用它的引用初始化foo,完美满足生命周期要求。
方案2:代码块包裹封装
用代码块把Bar的创建和Foo的实例化包起来,Rust会自动延长临时变量的生命周期,让它和foo保持一致:
fn main() { let foo = { let bar = Bar::empty(); Foo::new(&bar) }; println!("{}", foo.bar.value); }
代码块内部的bar因为引用被用作代码块的返回值,生命周期会被自动延长到和foo相同,既实现了单行声明,又符合安全规则。
这两种写法都能达到你想要的“单行实例化Foo”的效果,同时完全遵循Rust的生命周期约束。
内容的提问来源于stack exchange,提问作者Anders
相关产品推荐
相关产品推荐

