根据专业化 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)
即使其中一个实现是默认的,编译器仍然告诉我这两个实现是冲突的。
您的第二个实现不是第一个的专业化。这是一个与第一个冲突的替代实现。
专业化要求与您的第二个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了解更多详情。
| 归档时间: |
|
| 查看次数: |
782 次 |
| 最近记录: |