我正在编写一个玩具BigInt类,并在实现Add trait
时注意到它会占用两个输入值的所有权。与这个方法借用引用相比,这种处理方式试图解决什么问题?由于我使用Vec
作为底层数据结构,无法实现Copy
,这使得使用起来稍微有些麻烦。
它带来的一个(小)不便之一的示例:
let i = BigInt::new();
// - move occurs because `i` has type `BigInt`, which does not implement the `Copy` trait
let j = i + 16u32;
// --------- `i` moved due to usage in operator
let k = i + 32u32;
// ^ value used here after move
虽然我知道可以使用 .clone()
,但我很好奇这种方式如何帮助程序员。
i32
实现 4 次,每次对应一种引用的组合。 - N. SheadCopy
类型的引用实现它,以避免隐藏分配。因此,我认为对于Copy
类型,值得做所有4个实现,我会将其添加到答案中。 - Filipe RodriguesCopy
类型,当实现Add<&T> for &T
时,您有两个&T
可用。但是,如果您想将实现委托给Add<T> for T
(或Add<&T> for T
),则需要克隆&T
以获取T
,以便能够调用其他实现。 - Filipe Rodrigues