为什么可变引用在 impl 和普通函数之间不一致?

Sid*_*eli 3 types reference rust mutable-reference

对于 impl 块中的函数,我们使用以下语法:

fn test(&mut self) {}
Run Code Online (Sandbox Code Playgroud)

但对于普通函数,我们使用以下语法:

fn test(data: &mut u64) {}
Run Code Online (Sandbox Code Playgroud)

我理解self是变量,而Self是类型。在第一种情况下,我们使用&mut变量 ( self),但在第二种情况下,我们使用&mut类型 ( u64)。为什么会出现这种不一致的情况呢?

kmd*_*eko 8

self作为关联函数的第一个参数的存在具有特殊含义,并且具有特殊的简写语法:

  • self是缩写self: Self
  • &self是缩写self: &Self
  • &mut self是缩写self: &mut Self

所以你可以看到 inmut&mut self其类型的一部分;self是一个可变引用。


为了完整起见,您可能还会在参数名称和类型mut 之前看到一个单独的字符。这意味着变量可以发生变异和反弹,但不会影响类型。let这与vs具有相同的区别let mut。即mut data: &u64意味着u64无法修改所引用的变量,但data可以重新分配该变量以引用不同的u64.