Rust所有权转移与可变引用疑问:为何p2无需mut即可修改?
问题解答
核心要区分变量的可变性和引用的可变性两个完全不同的概念:
对于拥有所有权的变量(比如
p1):变量的mut标记决定了你能否通过这个变量修改它指向的数据。因为Vec::push方法需要接收&mut self(自身的可变引用),只有当变量被声明为mut时,你才能从这个变量获取到&mut self来调用修改类方法。对于持有可变引用的变量(比如
p2):p2是一个存储了可变引用的不可变变量。变量本身的不可变性,仅意味着你不能把p2重新赋值成另一个引用;但它存储的&mut p1本身就具备修改目标数据的权限,所以直接用它调用push这类需要&mut self的方法完全合法。
举个反例验证:如果尝试给p2重新赋值,编译器会报错,因为它不是mut变量:
let p = vec![23, 3, 31, 4]; let mut p1 = p; let p2 = &mut p1; p2 = &mut vec![]; // 编译失败:cannot assign to immutable variable `p2`
但调用p2.push(11)完全没问题,因为我们只是在使用可变引用的修改权限,而非修改p2这个变量本身。
内容的提问来源于stack exchange,提问作者PRATHIV
相关产品推荐
相关产品推荐

