[英]Implementing Deref on a struct that owns a boxed trait
我想在拥有盒装特征的结构上实现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
}
}
无法编译时出现以下错误:
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 }
如果我用Box<String>
(或类似的类型)替换Box<Quack>
,它可以工作。 问题是Quack
是一个特质。 但我不确定为什么会产生错误消息。 有任何想法吗?
我的问题类似于另一个SO问题 ,但不完全一样。 在该问题中,struct具有类型参数,其中trait为约束。 而在我的问题中,没有类型参数。
我不想混淆这些问题,但我有充分的理由在我的应用程序中需要Box<Quack>
。 即我不能用类型参数替换Quack
。 如果您关心,原因将在另一个SO问题中进一步讨论 。
如有疑问,请添加更多生命周期注释:
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
}
}
根据Brian的回答和Shepmaster的解释,我更新了我的代码如下。 我还简化了QuackWrap
结构。 (这不是绝对必要的,但它的风格可能比以前更好。)
use std::ops::{Deref, DerefMut};
trait Quack {
fn quack(&self);
}
struct QuackWrap(Box<Quack>);
impl Deref for QuackWrap {
type Target = Box<Quack + 'static>;
fn deref<'a>(&'a self) -> &'a Box<Quack + 'static> {
let QuackWrap(ref v) = *self;
v
}
}
impl DerefMut for QuackWrap {
fn deref_mut<'a>(&'a mut self) -> &'a mut Box<Quack + 'static> {
let QuackWrap(ref mut v) = *self;
v
}
}
有可能是解构一个更简洁的方式QuackWrap
在deref
和deref_mut
实现。 其中一些比较模糊的语法规则让我望而却步。 但是现在这很好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.