在拥有盒装特征的结构上实现Deref

rlk*_*024 5 rust

我想实现Deref,并DefrefMut在拥有盒装性状,例如一个结构:

use std::ops::{Deref, DerefMut};

trait Quack {
    fn quack(&self);
}

struct QuackWrap {
    value: Box<Quack>
}

impl Deref for QuackWrap {
    type Target = Box<Quack>;

    fn deref<'a>(&'a self) -> &'a Box<Quack> {
        &self.value
    }
}

impl DerefMut for QuackWrap {
    fn deref_mut<'a>(&'a mut self) -> &'a mut Box<Quack> {
        &mut self.value
    }
}
Run Code Online (Sandbox Code Playgroud)

无法编译时出现以下错误:

src/main.rs:14:5: 16:6 error: method `deref` has an incompatible type for trait: expected bound lifetime parameter 'a, found concrete lifetime [E0053]
src/main.rs:14     fn deref<'a>(&'a self) -> &'a Box<Quack> {
src/main.rs:15         &self.value
src/main.rs:16     }
src/main.rs:20:5: 22:6 error: method `deref_mut` has an incompatible type for trait: expected bound lifetime parameter 'a, found concrete lifetime [E0053]
src/main.rs:20     fn deref_mut<'a>(&'a mut self) -> &'a mut Box<Quack> {
src/main.rs:21         &mut self.value
src/main.rs:22     }
Run Code Online (Sandbox Code Playgroud)

如果我更换Box<Quack>Box<String>(或类似类型),它的工作原理.问题是这Quack是一个特点.但我不确定为什么会产生错误消息.有任何想法吗?

我的问题类似于另一个SO问题,但不完全一样.在该问题中,struct具有类型参数,其中trait为约束.而在我的问题中,没有类型参数.

我不想混淆这些问题,但Box<Quack>我的申请需要一个很好的理由.即我不能Quack用类型参数替换.如果您关心,原因将在另一个SO问题中进一步讨论.

Bri*_*ell 7

如有疑问,请添加更多生命周期注释:

use std::ops::{Deref, DerefMut};

trait Quack {
    fn quack(&self);
}

struct QuackWrap<'b> {
    value: Box<Quack + 'b>
}

impl<'b> Deref for QuackWrap<'b>{
    type Target = Box<Quack + 'b>;

    fn deref<'a>(&'a self) -> &'a Box<Quack + 'b> {
        &self.value
    }
}

impl<'b> DerefMut for QuackWrap<'b> {
    fn deref_mut<'a>(&'a mut self) -> &'a mut Box<Quack + 'b> {
        &mut self.value
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 具体来说,这有帮助,因为`struct QuackWrap {value:Box <Quack>}`相当于`struct QuackWrap {value:Box <Quack +'static>}`. (4认同)