Reference 如何对一个值或值本身的引用进行抽象?

Reference 如何对一个值或值本身的引用进行抽象?,reference,rust,Reference,Rust,我有一个特性,它为可以保存值的对象定义了一个接口。trait有一种获取当前值的方法: pub trait HasValue<T> { fn get_current_value(&self) -> &T; } 然后更改get\u current\u value()以返回一个借来的行,但我不确定这是否惯用BorrowedRowned有点让我想起了Cow,但既然Cow的目的是在写入时进行复制,我将放弃任何写入,这似乎在语义上是错误的 Cow是对引用或拥有的值

我有一个特性,它为可以保存值的对象定义了一个接口。trait有一种获取当前值的方法:

pub trait HasValue<T> {
    fn get_current_value(&self) -> &T;
}
然后更改
get\u current\u value()
以返回一个
借来的行
,但我不确定这是否惯用
BorrowedRowned
有点让我想起了
Cow
,但既然
Cow
的目的是在写入时进行复制,我将放弃任何写入,这似乎在语义上是错误的


Cow
是对引用或拥有的值进行抽象的正确方法吗?有没有比
借来的Rowned
更好的方法呢?

我建议您使用
Cow
,因为您的
借来的Rowned
Cow
没有区别,只是它有较少的方便方法。任何人只要掌握了一个
借来的对象,就可以匹配该对象,并获得它所拥有的值或对它的可变引用。如果您想避免由于获取可变引用或对象本身而产生的混淆,下面的解决方案也适用

对于您的用例,我只想使用
&T
,因为没有理由使API更复杂。如果用户想要
usize
,当
T
usize
时,他们可以简单地取消引用


只有当您希望用户以自有方式实际处理它时,自有对象才有意义。即使如此,
Cow
也意味着对你通过所有权传递的大/重对象进行抽象,目的是不要求任何人克隆它。您的用例正好相反,您希望通过所有权传递小对象,以防止用户需要复制小对象,而您正在复制它。

是否会返回关联类型
B:Borrow
work?@ChrisEmerson我不确定这样做的权衡,因此我不确定。你能再详细一点吗?这似乎是一个普遍有用的问题,所以我对所有的答案都感兴趣,即使它们没有针对我的具体情况;你最终还是需要像奶牛这样的东西。谢谢你的建议。为了简化问题,我错误地陈述了我的原因,有时我想返回
&T
,而有时我需要返回
T
。如果实现将
T
存储在
Arc
中(例如),则不可能简单地返回
&T
T
必须克隆,因为克隆位于函数堆栈上,所以不能返回对它的引用。我希望这会有帮助。附言:在RBR与您交谈真是太好了:)啊!这更有道理。好。。然后,我建议您的
borroweedRowned
应该是
enum-borrowed-very-true。我得好好玩玩一下,但我要把这个作为答案,因为你已经回答了我关于
Cow
的问题,这无疑为我指明了正确的方向。感谢术语
Cow
对于新手来说有点混乱,尤其是在处理您从未打算复制或写入的只读返回值时。当我意识到
Cow
时,我正在寻找类似
maybebowned
的东西。但似乎也使用了
Cow
pub enum BorrowedOrOwned<'a, T: 'a> {
    Borrowed(&'a T),
    Owned(T)
}

impl<'a, T: 'a> Deref for BorrowedOrOwned<'a, T> {
    type Target = T;

    fn deref(&self) -> &T {
        use self::BorrowedOrOwned::*;

        match self {
            &Borrowed(b) => b,
            &Owned(ref o) => o,
        }
    }
}