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::new为Vec<&C>where C: HTML,要么添加HTMLfor 引用的全面实现:
impl<T: HTML> HTML for &T {
fn to_email_body(&self) {
self.to_email_body()
}
}
- 重要的部分不是为 **a** 引用实现它,而是为 **每个** 引用实现它。请注意,我的答案中的全面实现将自动实现 `HTML`,以引用实现 `HTML` 的内容。