Rust成语“克隆,如果不可变或引用”

时间:2019-05-01 00:39:31

标签: rust

我正在尝试创建一个通用方法接口,该接口采用几种ref类型,并在可能的情况下尝试保存一个副本。我有两个问题:

  1. 关于引用&这样有很多特征,但是我不确定如何应用它们,以便您可以在单个泛型函数中告诉btwn值,mut值,ref,mut ref。
  2. 是否有最佳的克隆实践?我玩过Cow,From / Into,ToOwned,AsRef,Deref等游戏,但我只是找不到明智的方法。

Cow有了我想要的东西,但是如果我在输入中公开Cow,就不能在没有实现的情况下使用Cow :: from,而Cow :: Owned / Borrowed不能达到大多数目的。而且我不知道是否暴露出Cow的投入。 From / Into几乎是完美的,但是我无法使用泛型。我还尝试过将功能拆分为单独的特征并实现,但是编译器无法在它们之间进行选择。

我在下面有一个基本的演示。如果要获得一个不错的接口,我也可以控制Bar接口,但是如果没有一种简单的方法可以从根本上完善参数的传递,我会感到惊讶。

How does Rust provide move semantics?类似,但没有解决问题。

struct Foo {
    x: i32
}
impl Foo {
    // Move bar in; no clone, return original
    pub fn add<T: Bar>(&self, mut bar: T) -> T {
        bar.plus(self.x);
        bar
    }
    // bar immutable or reference; clone and return
    pub fn add<T: Bar>(&self, bar: T | &T | &mut T) -> T {
        let mut newbar = bar.clone();
        newbar.plus(self.x);
        newbar
    }
}

0 个答案:

没有答案