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

Rust含可变引用数组的结构体生命周期问题求助

Rust 生命周期问题:临时数组的生命周期不足

你的代码存在核心问题:new 函数里创建的 [1u8, 2u8] 和 [3u8, 4u8, 5u8] 是临时栈数组,它们的生命周期仅局限于当前表达式,而你试图将指向这些临时数组的可变切片存入 Data 结构体并返回,这违反了 Rust 的生命周期规则——结构体持有的引用不能比被引用的数据存活更久。

以下是两种可行的解决方式:

方案一:结构体直接持有数据(无需引用)

如果不需要引用语义,直接让结构体持有堆分配的数组(用 Vec),彻底规避生命周期问题:

struct Data {
    f: [Vec<u8>; 2],
}

impl Data {
    fn new() -> Self {
        let mut p = Self {
            f: [vec![1u8, 2u8], vec![3u8, 4u8, 5u8]],
        };
        p.f[0][1] = 5;
        p.f[1][2] = 7;
        p
    }
}

fn main() {
    let v = Data::new();
    println!("{:?}", v.f);
}

方案二:确保引用数据的生命周期足够长

如果必须使用引用,需要让被引用的数据拥有比结构体更长的生命周期,比如将数据放在调用方(main 函数)中,再传递给 Data:

struct Data<'a> {
    f: [&'a mut [u8]; 2],
}

impl<'a> Data<'a> {
    fn new(f0: &'a mut [u8], f1: &'a mut [u8]) -> Self {
        let mut p = Self {
            f: [f0, f1],
        };
        p.f[0][1] = 5;
        p.f[1][2] = 7;
        p
    }
}

fn main() {
    let mut arr0 = [1u8, 2u8];
    let mut arr1 = [3u8, 4u8, 5u8];
    let v = Data::new(&mut arr0, &mut arr1);
    println!("{:?}", v.f);
}

内容的提问来源于stack exchange,提问作者Evgeny Pogorelov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 14:55:04