首页 > 解决方案 > 如何解决“上游板条箱可能会添加新的 impl of trait”错误?

问题描述

我创建了一个特征,用于从某些值转换为我需要的类型。From许多类型的/已经涵盖了这种转换Into,但不是我想要的一切。我以为我可以利用这一点,但很快就得到了一个错误“上游板条箱可能会添加一个新的 impl of trait”。

(操场上的精简示例)

pub trait Cookable {
    fn cook(self) -> (String, Vec<i8>);
}

impl<T: Into<Vec<i8>>> Cookable for T {
    fn cook(self) -> (String, Vec<i8>) {
        (String::from("simple"), self.into())
    }
}

impl Cookable for &str {
    fn cook(self) -> (String, Vec<i8>) {
        (String::from("smelly"), vec![self.len()])
    }
}

这会触发以下错误:

error[E0119]: conflicting implementations of trait `Cookable` for type `&str`:
  --> src/lib.rs:11:1
   |
5  | impl<T: Into<Vec<i8>>> Cookable for T {
   | ------------------------------------- first implementation here
...
11 | impl Cookable for &str {
   | ^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `&str`
   |
   = note: upstream crates may add a new impl of trait `std::convert::From<&str>` for type `std::vec::Vec<i8>` in future versions

我担心解决此错误的唯一方法是为每个已经具有Into.

标签: rusttraits

解决方案


这不是您可以“解决”的问题。这是编译器施加的限制,以防止将来对依赖项的更改巧妙地改变代码的行为。

现在,您通过实现具体类型而不是使用泛型和特征来避免错误。宏是减少键盘输入量的一种方法。

将来,某种形式的专业化也可能有助于解决这个问题。然而,这正好是专业化不稳定的原因。可以使用这种类型的专门化仅使用安全代码来创建不健全的 Rust。正在研究一种简化的专业化形式,但它故意避开基于特征的专业化能力,仅适用于具体类型。

也可以看看:


推荐阅读