impl&dyntrait如何限制泛型?

我想创建一个 Vec<T>whereT绑定到一个叫做 HTML 的特征:

pub trait HTML {
    fn to_email_body(&self) -> String;
}

现在我想要一个结构:

impl Body {
pub fn new(from: String, to: Vec<String>, components: Vec<C>) -> Self 
    where C: HTML 
    {
        Self {
            from,
            to,
            components,
        }
    }
}

所以我可以将components泛型类型T传递给new构造函数。

但是,我必须创建一个Vec<&dyn HTML>Rust 才能在编译时调整它的大小:

let mut components: Vec<&dyn HTML> = Vec::new();
components.push(&dashboard);

一个 trait impl 看起来像这样吗?到目前为止我有

impl HTML for Dashboard {
    fn to_email_body(&self) -> String {
        format!("{}", self)
    }
}

现在我收到以下错误:

the trait bound `&dyn HTML: HTML` is not satisfied
the trait `HTML` is not implemented for `&dyn HTML`

我不知何故无法在我必须定义&dyn特征/特征实现的部分的地方建立联系!

回答

dyn HTML实现HTML&dyn HTML没有。要么更改Body::newVec<&C>where C: HTML,要么添加HTMLfor 引用的全面实现:

impl<T: HTML> HTML for &T {
    fn to_email_body(&self) {
        self.to_email_body()
    }
}

  • 重要的部分不是为 **a** 引用实现它,而是为 **每个** 引用实现它。请注意,我的答案中的全面实现将自动实现 `HTML`,以引用实现 `HTML` 的内容。

以上是impl&amp;dyntrait如何限制泛型?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>