首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >参考文献和自有价值转换为奶牛的特点

参考文献和自有价值转换为奶牛的特点
EN

Stack Overflow用户
提问于 2022-03-10 18:35:06
回答 2查看 80关注 0票数 1

我有一个函数,它可以通过接受一个Foo来处理某些类型的Cow<'_, Foo>所拥有的和借用的值。但是,我想让它更方便,允许直接传入或借来的Foo

是否有可能在引用类型及其所属版本上都实现到Cow的转换特性?

这就是我试过的:

代码语言:javascript
运行
复制
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

EN

Stack Overflow用户

发布于 2022-03-10 18:35:06

Self&Foo的一个特性的实现中是&Foo,因此into_cow()在这两个隐式中都不会返回相同的类型。

一种解决方案是将返回类型更改为Cow<'a, Foo>,但这当然限制了只在Foo上工作的特性。

更好的方法是使拥有的类型成为Convert的泛型参数,如下所示:

代码语言:javascript
运行
复制
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{});
}
票数 1
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71429142

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档