如何使Rust可变引用不可变?

jbr*_*own 15 rust

我正在尝试将可变向量转换为Rust中的不可变向量.我认为这会起作用,但它没有:

let data = &mut vec![];
let x = data;          // I thought x would now be an immutable reference
Run Code Online (Sandbox Code Playgroud)

如何将可变引用转换为不可变绑定?

She*_*ter 18

取消引用然后重新引用该值:

fn main() {
    let data = &mut vec![1, 2, 3];
    let x = &*data;
}
Run Code Online (Sandbox Code Playgroud)

对于你的代码正在做什么,你应该阅读变量名之前和`:`之后的`mut`的区别什么?.您的变量data已经是不可变的,但它包含一个可变引用.您无法重新分配data,但可以更改指向的值.

如何将可变引用转换为不可变绑定?

它已经一个不可变的绑定,因为你无法改变它是什么data.


Pen*_*ian 9

现在有效的另一个解决方案是指定 x 的类型:

fn main() {
    let data = &mut vec![1, 2, 3];
    let x: &_ = data;
    println!("{x:?}");
    // This will fail as x immutable
    // *x = vec![]
}
Run Code Online (Sandbox Code Playgroud)

当您不指定类型时,编译器会假定您需要相同的类型,而该类型恰好是&mut Vec<_>.