rust - 如何解决“上游板条箱可能会添加新的 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
.
解决方案
这不是您可以“解决”的问题。这是编译器施加的限制,以防止将来对依赖项的更改巧妙地改变代码的行为。
现在,您通过实现具体类型而不是使用泛型和特征来避免错误。宏是减少键盘输入量的一种方法。
将来,某种形式的专业化也可能有助于解决这个问题。然而,这正好是专业化不稳定的原因。可以使用这种类型的专门化仅使用安全代码来创建不健全的 Rust。正在研究一种简化的专业化形式,但它故意避开基于特征的专业化能力,仅适用于具体类型。
也可以看看:
推荐阅读
- load-balancing - 具有负载平衡 Web 服务器的 ITfoxtec SAML
- javascript - 在无名的父对象中调用带有空格的子对象
- regex - 正则表达式查找第二个 / 并开始计数 5 个字符
- excel - 当过滤器没有数据时跳过表的副本
- aws-api-gateway - 具有认知授权的 AWS API 网关
- android - 在ionic3中使用facebook插件时构建android apk时出错
- git - RunCloud 部署脚本与 Laravel Forge - 为什么使用 git merge 而不是 git pull?
- powershell - 从 PowerShell Get-ChildItem -match 中排除所有子目录
- javascript - javascript 中的 JRE Bit 版本
- javascript - 如何在表单提交之前更改文件的顺序 - Jquery / Javascript