Rust 不可变对象根据函数签名更改为可变对象

Rust 不可变对象根据函数签名更改为可变对象,rust,immutability,move-semantics,borrow-checker,Rust,Immutability,Move Semantics,Borrow Checker,检查下面的防锈代码。它编译 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

检查下面的防锈代码。它编译

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
}
这里我声明vec0是不可变的,但fill_vec接受可变的向量。根据函数签名,它似乎正在改变所传递参数的性质


我的问题是,这显然像是对你自己的脚开了一枪。为什么锈允许这样?或者,这真的安全吗?我遗漏了什么?

您正在使fill\u vec的参数vec可变。您仍在按值传递vec


如果你想要一个可变的引用,你可以使用vec:&mut-vec。

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

首先,mut实际上并不意味着可变。存在诸如内部可变性、单元、互斥体等,它们允许您修改状态而无需单个互斥。相反,mut意味着您可以获得相互排斥的引用

第二,可变性是绑定的一个属性。main中的vec0和fill_vec中的vec是不同的绑定,因此它们可以具有不同的可变性

另见:

最后所有权:fill_vec完全拥有它的参数,实际上它在main中已经不存在了。为什么不允许函数用它自己的参数做任何它想做的事情?如果函数将该参数作为可变引用,则需要将原始绑定声明为mut:

fn干线{ 让mut vec0=Vec::new; //现在需要一个可变绑定 填充向量&mut向量0; //^^^^需要一个显式的“&mut”引用 } fn填充向量:&mut向量{ //^^^^^借款而不是取得所有权 // … }
这回答了你的问题吗@E_net4isadownvote这个问题似乎比链接重复的候选人更一般;如果你把所有权交给新主人,新主人有权做任何事情,甚至是破坏,如果你有顾虑,那么你必须按照规定把它借给适当的目标。谢谢。这回答了我的问题。