Reference 如何对一个值或值本身的引用进行抽象?
我有一个特性,它为可以保存值的对象定义了一个接口。trait有一种获取当前值的方法: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是对引用或拥有的值
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,
}
}
}