实现 Trait 和特化

8
根据 specialization RFC,我应该能够通过指定一个默认项,在一个 struct 上有多个相同 traitimpl
我的代码如下:
#![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)
    }
}

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

1个回答

8
您的第二个实现并不是第一个实现的专门化。它是一种与第一个实现冲突的替代实现。
专门化需要确保所有符合第二个impl的类型也符合第一个impl。换句话说,您的专门化边界需要是默认实现边界的严格子集。从RFC中可以看到:
“该RFC提出了一种专门化设计,允许多个impl块适用于同一类型/特征,只要其中一个块明显比另一个更具体。”
将您的特征定义更改为:
trait Dummy: Into<u32> {}

使您的代码编译。
有关更多详细信息,请查看https://github.com/rust-lang/rfcs/blob/master/text/1210-impl-specialization.md

1
RFC 中有关于专业化的严格子集边界的规定吗?您能提供相关链接吗? - Ömer Erden

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接