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

Rust不转移所有权创建Rc实例的惯用实现方案

你遇到的编译错误本质是无法多次移动同一个Struct实例的所有权:同一个元素会被多个Pair引用,而你每次调用Rc::new(vec[i])都会尝试把元素从原Vec中移走,第一次移动后原Vec就不再持有该元素,后续访问自然非法。

要实现每个Struct实例仅在内存中保留一份、无额外拷贝开销的需求,Rust惯用的实现方式如下:

核心思路

先将原Vec中所有元素提前包装为Rc<Struct>,转移所有权到新的Vec<Rc<Struct>>中;后续构建Pair时仅克隆Rc(仅增加引用计数,时间复杂度O(1),不会拷贝底层Struct实例)。

完整可运行代码

use std::rc::Rc;

struct Struct {}

struct Pair {
    first: Rc<Struct>,
    second: Rc<Struct>
}

fn pair_lists(vec: Vec<Struct>) -> Vec<Pair> {
    // 一次性将所有元素包装为Rc,每个Struct仅创建一次
    let rc_vec: Vec<Rc<Struct>> = vec.into_iter().map(Rc::new).collect();
    let mut pairs = Vec::new();
    
    for i in 0..rc_vec.len() {
        for j in i + 1..rc_vec.len() {
            let new_pair = Pair {
                // 显式调用Rc::clone是Rust惯例,明确表示此处仅克隆引用计数
                first: Rc::clone(&rc_vec[i]),
                second: Rc::clone(&rc_vec[j])
            };
            pairs.push(new_pair);
        }
    }
    
    pairs
}

fn main() {}

扩展说明

  • 如果你需要在多线程环境下使用该逻辑,将Rc替换为Arc即可,其余逻辑完全不变。
  • 如果需要修改Struct实例的内容,可以搭配RefCell(单线程场景)或RwLock/Mutex(多线程场景)实现内部可变性,依旧不会产生额外的实例拷贝开销。

内容的提问来源于stack exchange,提问作者Alex Coleman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 14:54:03