根据specialization RFC,通过将impl
指定为默认值,我应该能够在trait
上具有相同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)
}
}
。
目前,我有一些类似于下面的代码。
(ns test
(:require [clojure.string :as str]))
(defn read-in-board [filepath]
(str/split-lines (slurp filepath)))
(mapv vec (read-in-board "temp.txt"))
即使其中一种实现是默认的,编译器仍告诉我这两种实现是冲突的。
答案 0 :(得分:3)
您的第二个实现不是第一个实现的专业化。这是与第一种冲突的替代实现。
专业化要求与您的第二个impl
匹配的所有类型也必须与您的第一个impl
匹配。换句话说,您的专业化范围必须是默认实现范围的严格子集。从RFC:
此RFC提出了一种专门化的设计,该设计允许多个impl块应用于相同的类型/特征,只要其中一个块明显比另一个块“更具体”即可。
将特征定义更改为
trait Dummy: Into<u32> {}
使您的代码编译。
查看https://github.com/rust-lang/rfcs/blob/master/text/1210-impl-specialization.md了解更多详细信息。