You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:43:39