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

Rust中如何不转移所有权传递值?兼代码传参问题咨询

在Rust中不转移所有权传递值的方法及代码修正

核心概念

在Rust中,不转移所有权传递值的核心方式是引用,分为两种:

  • 不可变引用(&T):仅允许读取数据,不会修改原变量,同一时间可以存在多个不可变引用。
  • 可变引用(&mut T):允许修改原变量,但同一时间只能存在一个可变引用,保证内存安全。

你的代码中问题出在:传递了&mut vec可变引用,且let mut copy = vec;只是复制了引用本身,并非克隆整个Vec,所以copy.sort()直接修改了原Vec的数据。

解决方案

根据你的需求,有两种可行方向:

方向1:传递不可变引用,内部创建副本(不修改原Vec)

如果希望原Vec保持不变,只需传递不可变引用,在函数内部克隆出独立副本进行操作:

use std::collections::HashMap;

fn main() {
    let vec = vec![4, 3, 6, 7, 5, 8, 1, 2, 9, 0, 1];

    println!("计算结果: {:?}", solution(&vec));
    println!("原Vec未被修改: {:?}", vec);
}

fn solution(vec: &Vec<i32>) -> (i32, i32, i32) {
    let mut copy = vec.clone(); // 克隆整个Vec,生成独立副本

    copy.sort();
    println!("排序后的副本: {:?}", copy);

    // 简化类型转换逻辑
    let len: i32 = copy.len().try_into().unwrap_or_else(|_| panic!("无法转换长度"));

    let avg = (*copy.last().unwrap() + *copy.first().unwrap()) / 2;

    let median = copy[copy.len() / 2];

    // 修正模式值(mode)的计算逻辑,找到出现次数最多的元素
    let mode = {
        let mut hmap = HashMap::new();
        for &element in copy.iter() {
            *hmap.entry(element).or_insert(0) += 1;
        }
        hmap.into_iter()
            .max_by_key(|&(_, count)| count)
            .map(|(val, _)| val)
            .unwrap_or(0)
    };

    (avg, median, mode)
}

方向2:转移所有权(原变量不再可用)

如果愿意让函数接管Vec的所有权,直接传递Vec本身即可,此时原作用域无法再使用该Vec,但函数内的操作不会影响任何外部数据:

use std::collections::HashMap;

fn main() {
    let vec = vec![4, 3, 6, 7, 5, 8, 1, 2, 9, 0, 1];

    println!("计算结果: {:?}", solution(vec));
    // 此处不能再访问vec,因为所有权已转移到solution函数中
}

fn solution(mut vec: Vec<i32>) -> (i32, i32, i32) {
    vec.sort();
    println!("排序后的Vec: {:?}", vec);

    let len: i32 = vec.len().try_into().unwrap_or_else(|_| panic!("无法转换长度"));

    let avg = (*vec.last().unwrap() + *vec.first().unwrap()) / 2;

    let median = vec[vec.len() / 2];

    let mode = {
        let mut hmap = HashMap::new();
        for element in vec.iter() {
            *hmap.entry(element).or_insert(0) += 1;
        }
        hmap.into_iter()
            .max_by_key(|&(_, count)| count)
            .map(|(val, _)| *val)
            .unwrap_or(0)
    };

    (avg, median, mode)
}

关键说明

  • 引用不会获取所有权,函数执行完毕后,引用会自动失效,原变量依然可用。
  • 克隆(clone())会创建数据的完整副本,开销取决于数据大小,适合中小型集合。
  • 转移所有权后,原变量会被Rust标记为不可用,避免了悬垂指针等内存问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 21:07:01