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