为什么我不能重新绑定引用变量,但我可以重新绑定结构中的引用字段?

Jia*_* Xu 0 rust

似乎我无法在 rust 中重新绑定参考变量

let mut arr = [1, 2, 3, 4]; 
                            
let & mut a0 = & mut arr[0];
println!("a0 = {}", a0);    
                            
let mut i = 0;              
a0 = &mut i; // mismatched types: expected integer, found `&mut {integer}`
Run Code Online (Sandbox Code Playgroud)

但我可以在里面重新绑定一个引用struct:

#[derive(Debug)]   
struct Ref<'a, T> {
    val: &'a T     
}                  

let mut arr = [1, 2, 3, 4];

let mut r = Ref {                                          
    val: & arr[0]                                          
};                                                         
println!("r = {:#?}", r);                                  
r.val = & arr[1];                                          
Run Code Online (Sandbox Code Playgroud)

我不能重新绑定引用变量是真的吗?

如果它不能,那么为什么struct像 C++ 一样允许它而不是禁止它?

顺便说一句,Ref<'a, T>在我的代码中是否有与此处相同的标准库类型?

Den*_*ret 5

当你写

let & mut a0 = & mut arr[0];
Run Code Online (Sandbox Code Playgroud)

你在这个 let 赋值中使用模式匹配:

& mut {}是图案。如果你替换{},你会得到a0匹配arr[0]。

的类型arr[0]是usize这样你定义一个a0类型的变量usize。

这就是为什么以后不能输入 type 值的原因&mut usize。

如果你想a0成为一个类型&mut usize,做

let mut a0 = &mut arr[0];
Run Code Online (Sandbox Code Playgroud)

然后你可以稍后做

let mut i = 0;              
a0 = &mut i;
Run Code Online (Sandbox Code Playgroud)

  • @JiaHaoXu 当你写 `let &amp; mut a0 = &amp; mut arr[0];` 我猜你的意思是 `let a0: &amp;mut i32 = &amp; mut arr[0];` (​​你还必须在之前插入 `mut` `a0` 允许之后重新分配)。在 Rust 中,您可以在 `:` 之后指定类型。你的公式是模式匹配,因为在 `let` 语句中,Rust 试图使 `=` 符号的两边都匹配。这里“&amp;mut”两边完美匹配,然后新名称“a0”与“arr[0]”关联,后者是一个整数。最后,“ao”是一个整数,而不是对整数的可变引用。 (3认同)
  • @JiaHaoXu 该链接明确指出 `let` 赋值的左侧是一个模式,并继续显示使用该模式进行解构的示例,例如 `let (x, y, z) = (...) `。`print_coordinates()` 示例进一步演示了在函数参数中使用模式的取消引用。 (2认同)