簡體   English   中英

在擁有盒裝特征的結構上實現Deref

[英]Implementing Deref on a struct that owns a boxed trait

我想在擁有盒裝特征的結構上實現DerefDefrefMut ,例如:

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
    }
}

有可能是解構一個更簡潔的方式QuackWrapderefderef_mut實現。 其中一些比較模糊的語法規則讓我望而卻步。 但是現在這很好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM