gpt4 book ai didi

rust - 不可变对象(immutable对象)根据函数签名更改为可变对象

转载 作者:行者123 更新时间:2023-12-03 11:28:13 25 4
gpt4 key购买 nike

检查下面的 Rust 代码。它编译

fn main() {
let vec0 = Vec::new();

let mut vec1 = fill_vec(vec0);

println!("{} has length {} content `{:?}`", "vec1", vec1.len(), vec1);

vec1.push(88);

println!("{} has length {} content `{:?}`", "vec1", vec1.len(), vec1);
}

fn fill_vec(mut vec: Vec<i32>) -> Vec<i32> {
vec.push(22);
vec.push(44);
vec.push(66);

vec
}

我在这里声明 vec0immutablefill_vec 接受一个可变向量。根据函数签名,Rust 似乎正在改变所传递参数的性质。

我的问题是,这显然像是“搬起石头砸自己的脚”的瞬间。为什么 Rust 允许这样做?或者,这真的安全吗?我错过了什么?

最佳答案

这里有不同的东西可以解释为什么这种行为有意义:

  • 首先,mut 并不真的 意味着“可变”。有内部可变性、CellMutexes 等,它们允许您修改状态而无需单个 mut。相反,mut 意味着您可以获得相互 独占引用。

  • 其次,可变性是绑定(bind)的一个属性。 main中的vec0fill_vec中的vec是不同的绑定(bind),所以它们可以有不同的可变性。

    另见:

  • 最终所有权:fill_vec 获得其参数的全部所有权,实际上在 main 中不再存在。为什么不允许函数使用其拥有的参数做任何想做的事情?如果函数将参数作为可变引用,您将需要将原始绑定(bind)声明为 mut:

    fn main() {
    let mut vec0 = Vec::new();
    // ^^^ now _needs_ a mutable binding

    fill_vec(&mut vec0);
    // ^^^^ needs an explicit `&mut` reference
    }

    fn fill_vec(vec: &mut Vec<i32>) {
    // ^^^^ borrows rather than take ownership
    // …
    }

关于rust - 不可变对象(immutable对象)根据函数签名更改为可变对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62622438/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com