我有一个函数,它可以通过接受一个Foo来处理某些类型的Cow<'_, Foo>所拥有的和借用的值。但是,我想让它更方便,允许直接传入或借来的Foo。
是否有可能在引用类型及其所属版本上都实现到Cow的转换特性?
这就是我试过的:
trait Convert<'a> : Clone {
    fn into_cow(self) -> Cow<'a, Self>;
}
// Works
impl<'a> Convert<'a> for Foo {
    fn into_cow(self) -> Cow<'a, Self> {
        println!("owned");
        Cow::Owned(self)
    }
}
// Doesn't work
impl<'a> Convert<'a> for &'a Foo {
    fn into_cow(self) -> Cow<'a, Self> {
        println!("borrowed");
        Cow::Borrowed(self)
    }
}借用的版本说,Borrowed期望有一个&&'a Foo,但是找到了一个&'a Foo。
发布于 2022-03-10 18:35:06
Self在&Foo的一个特性的实现中是&Foo,因此into_cow()在这两个隐式中都不会返回相同的类型。
一种解决方案是将返回类型更改为Cow<'a, Foo>,但这当然限制了只在Foo上工作的特性。
更好的方法是使拥有的类型成为Convert的泛型参数,如下所示:
trait Convert<'a, T: Clone> {
    fn into_cow(self) -> Cow<'a, T>;
}
impl<'a, T: Clone> Convert<'a, T> for T {
    fn into_cow(self) -> Cow<'a, T> {
        println!("owned");
        Cow::Owned(self)
    }
}
impl<'a, T: Clone> Convert<'a, T> for &'a T {
    fn into_cow(self) -> Cow<'a, T> {
        println!("borrowed");
        Cow::Borrowed(self)
    }
}
fn take_foo<'a>(foo: impl Convert<'a, Foo>) {
    let cow = foo.into_cow();
}
fn main() {
    take_foo(&Foo{});
    take_foo(Foo{});
}发布于 2022-03-10 20:14:39
你有没有利用过所有权,还是总是借来的?如果只是再借,std::convert::AsRef是你要找的吗?
fn take_foo(foo: impl AsRef<Foo>) {
    let foo: &Foo = foo.as_ref();
    todo!();
}https://stackoverflow.com/questions/71429142
复制相似问题