gpt4 book ai didi

rust - 为实现 Trait 的类型实现 Borrow

转载 作者:行者123 更新时间:2023-11-29 07:46:13 25 4
gpt4 key购买 nike

假设我有一些特质:

trait MyTrait {
fn function1(&self);
}

和一些实现它的类型:

struct MyStruct {
number: i32,
}
impl MyTrait for MyStruct {
fn function1(&self) {
printn!("{}", self.number);
}
}

现在我有另一种类型,它想要获取实现 MyTrait 的东西.它不在乎它们是否被拥有。从四处阅读,听起来正确的方法是让它采取 Borrow<X>而不是 X&X管他呢。这让它接受 X 类型的东西, 或 Rc<X>Box<X>等等……

X 时我已经开始工作了是一个具体的类型,但是当 X 时我如何让它工作?是特质吗?

这是我首先尝试的:

struct Consumer<T> {
inner: T
}

impl<T: Borrow<MyTrait>> Consumer<T> {
pub fn new(inner: T) -> Consumer<T> {
Consumer {
inner: inner
}
}
pub fn do_stuff(&self) {
self.inner.borrow().function1();
}
}

fn main() {
// I want to eventually be able to swap this out for x = Rc::new(MyStruct ...
// but I'll keep it simple for now.
let x = MyStruct { number: 42 };
let c = Consumer::new(x);
c.do_stuff();
}

这还行不通,因为 MyStruct工具 Borrow<MyStruct> , 但不是 Borrow<MyTrait> .好的,让我们尝试实现它:

impl Borrow<MyTrait> for MyStruct {
fn borrow(&self) -> &MyTrait {
self
}
}

这给了我以下错误,我不明白:

<anon>:33:5: 35:6 error: method `borrow` has an incompatible type for trait:
expected bound lifetime parameter ,
found concrete lifetime [E0053]
<anon>:33 fn borrow(&self) -> &MyTrait {
<anon>:34 self
<anon>:35 }
<anon>:33:5: 35:6 help: see the detailed explanation for E0053
error: aborting due to previous error
playpen: application terminated with error code 101

什么?那里根本没有提到任何具体的生命周期,并且Borrow定义时也没有提及任何生命周期。我很难过。

首先,我使用 Borrow 的假设是否正确?是正确的方法吗?如果是这样,我该如何实现 Borrow有什么特点?

最佳答案

实现的正确写法是这样的:

impl<'a> Borrow<MyTrait + 'a> for MyStruct {
fn borrow(&self) -> &(MyTrait + 'a) {
self
}
}

Trait 对象可以使用生命周期限制。这是因为实现特征的类型可能包含引用,在某些情况下,我们需要能够区分依赖借用对象的对象和不依赖借用对象的对象。如果没有指定lifetime bound,我觉得默认是'static;但是,指定 &(MyTrait + 'static) 作为返回类型编译(它不太通用,所以你应该喜欢上面的通用解决方案),所以你遇到的问题比那更微妙......

关于rust - 为实现 Trait 的类型实现 Borrow<Trait>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36465009/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com