【问题标题】:Can I make a struct that works with both values and borrowed references to a trait?我可以制作一个既适用于值又适用于特征的借用引用的结构?
【发布时间】:2015-12-11 04:01:10
【问题描述】:

我想创建一个结构,它可以包装另一种类型,但可以采用实现给定特征的值的拥有和借用版本。

例如,假设我有 Foobar 的特质:

trait Foobar {
    fn foobar(&self);
}

我现在想创建一个结构来包装此特征的值或借用引用:

struct FoobarWrapper<T: Foobar> {
    wrapped: T,
    extra_stuff: Stuff
}

在这里,鉴于 impl Foobar for Baz,我希望 FoobarWrapper 与 Baz&amp;Baz 一起使用。

我想出了一种可能可行的解决方案,但我不知道它是否符合习惯,并且只需这样做:

impl<'a, T: Foobar> Foobar for &'a T  {
    fn foobar(&self) {
        (*self).foobar()
    }
}

如果我没记错的话,这对实现 Foobar 的值的任何引用也是 Foobar 的实现者。但这是你应该这样做的方式吗?

【问题讨论】:

    标签: rust traits borrow-checker


    【解决方案1】:

    是的,如果您可以支持,您的解决方案可能很好。 Iterator 做同样的事情

    impl<'a, I> Iterator for &'a mut I where I: Iterator + ?Sized
    

    为了灵活性,您可能还应该添加?Sized 绑定。

    【讨论】:

    • ?Sized,是不是因为如果您通过参考来确定目标的大小,那么它的大小并不重要?
    • @EmilEriksson 默认情况下,所有边界都有一个隐式的Sized 属性,它可以防止采用未指定大小的类型。但是,如果您仅通过间接方式使用绑定(例如 &amp;TBox&lt;T&gt;),则这是不需要的,?Sized 会删除限制。
    猜你喜欢
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 2017-06-20
    • 2014-11-26
    • 2016-04-28
    • 1970-01-01
    • 2015-05-29
    • 2022-10-13
    相关资源
    最近更新 更多