从特质和专业化实施

Ste*_*ffs 6 traits rust

根据专业化 RFC,我应该能够拥有多个impl通过将一个指定为默认值trait在 a 上相同的 s struct

我有代码:

#![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)
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Ric*_*ard 6

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

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

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

将您的特征定义更改为

trait Dummy: Into<u32> {}
Run Code Online (Sandbox Code Playgroud)

使您的代码编译。

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