【问题标题】:Implementing from trait and specialization从特质和专业化实施
【发布时间】:2019-05-26 01:10:03
【问题描述】:

根据specialization RFC,我应该能够在struct 上拥有多个impls 上的相同trait,方法是指定一个作为默认值。

我有代码:

#![feature(specialization)]
struct A(u32);

trait Dummy {}

impl<T> From<T> for A
where
    T: Into<u32>,
{
    default fn from(item: T) -> Self {
        A(item.into())
    }
}

impl<T> From<T> for A
where
    T: Dummy,
{
    fn from(item: T) -> Self {
        A(2)
    }
}

即使其中一个实现是默认的,编译器仍然告诉我这两个实现是冲突的。

【问题讨论】:

    标签: rust traits


    【解决方案1】:

    您的第二个实现不是第一个的专门化。这是与第一个冲突的替代实现。

    专业化要求与您的第二个impl 匹配的所有类型也与您的第一个impl 匹配。换句话说,您的专业化范围必须是默认实现范围的严格子集。来自 RFC:

    该 RFC 提出了一种专门化设计,允许多个 impl 块应用于相同的类型/特征,只要其中一个块明显比另一个块“更具体”。

    将特征定义更改为

    trait Dummy: Into<u32> {}
    

    使您的代码编译。

    查看https://github.com/rust-lang/rfcs/blob/master/text/1210-impl-specialization.md了解更多详情。

    【讨论】:

    • RFC 中是否有任何部分说明了专门化的严格子集界限?你能把那个链接起来吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-05
    • 2022-01-24
    相关资源
    最近更新 更多