【问题标题】:Default generic parameter that depends on an optional trait bound依赖于可选特征界限的默认泛型参数
【发布时间】:2022-11-20 18:40:57
【问题描述】:

我有一个可以存储拥有或借用的枚举,如下所示。它类似于std::borrow::Cow,但实际上并不提供写时克隆功能。

use std::borrow::Borrow;

enum RefOrOwned<'a, B, T>
where
    B: ?Sized,
    T: Borrow<B>,
{
    Ref(&'a B),
    Owned(T),
}

它可以这样使用:

fn main() {
    let str = RefOrOwned::<str, String>::Ref("Hi :D");
}

我希望编译器为我推断出 T 类型。我想到了使用std::borrow::ToOwned trait:如果B: ToOwned&lt;Owned = T&gt;,那么T应该默认设置为B::Owned。这可能吗?

【问题讨论】:

    标签: generics rust


    【解决方案1】:

    您可以将该类型声明为具有默认值 &lt;B as ToOwned&gt;::Owned,除非实际使用默认值,否则不需要 B 来实现 ToOwned

    enum RefOrOwned<'a, B, T = <B as ToOwned>::Owned>
    where
        B: ?Sized,
        T: Borrow<B>,
    {
        Ref(&'a B),
        Owned(T),
    }
    

    但是,这仅在您明确指定类型时才有效,即RefOrOwned::&lt;str&gt;。如果您将它们保留为推断 (RefToOwned::Ref("Hi :D")),则不会使用默认值。我认为在这种情况下没有办法强制默认。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-01
      • 1970-01-01
      相关资源
      最近更新 更多