【问题标题】:How impl &dyn trait bounds for generics?泛型的 impl &dyn 特征界限如何?
【发布时间】:2021-10-20 12:18:32
【问题描述】:

我想创建一个Vec<T>,其中T 绑定到一个名为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,
        }
    }
}

所以我可以将带有泛型类型Tcomponents 传递给new 构造函数。

但是,我必须创建一个 Vec&lt;&amp;dyn HTML&gt; 以便 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`

我无法在我必须定义 trait/trait impl 的 &amp;dyn 部分的地方建立联系!

【问题讨论】:

    标签: rust traits


    【解决方案1】:

    dyn HTML 实现 HTML&amp;dyn HTML 没有。要么将 Body::new 更改为 Vec&lt;&amp;C&gt; 其中 C: HTML,要么添加 HTML 的全面实现以供参考:

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

    【讨论】:

    • 谢谢!采取 &C 是有道理的,尽管我从那里开始了终生的地狱……我不太明白“供参考的 HTML”。如果我为&amp;Dashboard 实现这个,什么都不会改变。
    • 重要的部分不是为 a 引用实现它,而是为 every 引用实现它。请注意,我的答案中的一揽子实现将自动实现HTML,以引用实现HTML的东西。
    猜你喜欢
    • 1970-01-01
    • 2022-01-20
    • 2022-12-15
    • 2022-11-20
    • 2021-01-17
    • 2022-10-05
    • 2023-01-12
    • 2021-07-02
    • 1970-01-01
    相关资源
    最近更新 更多