锈从特质和专业化实施

时间:2019-05-26 01:10:04

标签: rust traits

根据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"))

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

1 个答案:

答案 0 :(得分:3)

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

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

  

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

将特征定义更改为

trait Dummy: Into<u32> {}

使您的代码编译。

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