to_owned() 什么时候不克隆?

dan*_*nda 7 rust borrowing

to_owned()状态的文档

从借用的数据创建拥有的数据,通常是通过克隆。

但是没有说明不会发生克隆的条件。“通常”很模糊,出于性能原因,我试图删除 clone() 调用。

有人可以澄清吗?

jos*_*nda 9

to_owned方法是特征的一部分ToOwned,因此它不能保证实现该特征的结构将克隆或不克隆to_owned正在调用的实例。该ToOwned特征的总体实现确实调用了,并且很少手动实现,这是几乎每次调用都会导致克隆的clone原因之一。to_owned

此外,正如 @Sven Marnach 所指出的,任何派生的结构Clone都会接收毯子实现,并且无法实现其自己的 实现ToOwned,这使得对毯子 imp 的调用更加常见。

请参阅下面的总体实施ToOwned

impl<T> ToOwned for T
where
    T: Clone,
{
    type Owned = T;
    fn to_owned(&self) -> T {
        self.clone()
    }

    fn clone_into(&self, target: &mut T) {
        target.clone_from(self);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • “像‘Copy’特征一样,它很少被手动实现”——‘Copy’是一个没有任何方法的标记特征。它通常由“#[derive(Copy)]”“实现”。`Copy` 的显式实现看起来像 `impl Copy for Foo {}`,因此简单地派生它没有什么好处。这与“ToOwned”不同:如果您的类型是“Clone”,您将获得“ToOwned”的全面实现,并且_不能_自己实现该特征。如果您输入的不是“Clone”并且需要“ToOwned”,则您_必须_自己实现它。 (5认同)