当前位置: 首页 > 知识库问答 >
问题:

我如何解决“上游板条箱可能会增加新的性状”错误?

呼延弘方
2023-03-14

我创建了一个特性,用于从一些值转换为我需要的类型。对于许多类型,这种转换已经被从/转换为所涵盖,但不是我想要的所有类型。我以为我可以利用这一点,但很快得到一个错误“上游板条箱可能会增加一个新的性状影响”。

(操场上的简化示例)

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

我担心解决这个错误的唯一方法是为已经有的每个类型指定单独的trait实现。

共有2个答案

杨宏儒
2023-03-14

根据Shepmaster列出的问题的答案,我想出了以下解决方案,似乎可以完成我的使命。它是一个实现"使用一个宏来紧凑地执行为一堆结构实现trait的所有样板":

extern crate jni;
use jni::objects::{JObject, JValue};
use jni::JNIEnv;

pub trait ConvertRustToJValue<'a> {
    fn into_jvalue(self, je: &JNIEnv<'a>) -> JValue<'a>;
}

macro_rules! impl_convert_rust_to_jvalue {
    ( $($t:ty),* ) => {
    $( impl<'a> ConvertRustToJValue<'a> for $t
    {
        fn into_jvalue(self, _je:&JNIEnv) -> JValue<'a>
        {
        self.into()
        }
    }) *
    }
}

impl_convert_rust_to_jvalue! { i8, i16, i32, i64 }
胡高朗
2023-03-14

这不是你可以“绕过”的问题。这是编译器施加的限制,以防止将来对依赖项的更改微妙地更改代码的行为。

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

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

另见:

  • 解决特质实现冲突
  • Rust中trait的冲突实现
  • 我如何实现从两个具体的错误类型和框
 类似资料:
  • 大部分软件都可以通过付出相对较小的努力,让他们比刚发布时快上10到100倍。在市场的压力下,选择一个简单而快速的解决问题的方法是比选择其它方法更为明智而有效率的选择。然而,性能是可用性的一部分,而且通常它也需要被更仔细地考虑。 提高一个非常复杂的系统的性能的关键是,充分分析它,来发现其“瓶颈”,或者其资源耗费的地方。优化一个只占用1%执行时间的函数是没有多大意义的。一个简要的原则是,你在做任何事情

  • 当我编译时,我得到了这个错误:TicTacToe.java:110:error:TicTacToe类中的方法addMove不能应用于给定的类型;if(addMove()){^required:int,int found:无参数原因:实际和正式参数列表长度不同1错误 我怎么才能修好这个?

  • 问题内容: 长期缺席并喜欢它之后,我目前正在重新使用Python。但是,我发现自己反复遇到一种模式。我一直认为,必须有一种更好的方式表达我想要的东西,而我可能做错了方式。 我正在编写的代码具有以下形式: 我在程序中写很多。我的第一个反应是将其推出辅助函数,但是通常python库已经提供了类似的功能。 我缺少一些简单的语法技巧吗?还是采用这种方式? 问题答案: 使用: 在Python> = 2.7中

  • 我有一个文件的内容 我想连续附加到这个文件并有权访问修改后的文件。 我尝试的第一件事是直接变异mmap: 这将导致恐慌: 生成的文件读取 之后,我尝试直接附加到后备文件: 这不会导致恐慌。该文件将定期更新,但我的mmap不会反映这些更改。我预计标准输出如下所示: 但我有 我主要对一个Linux的解决方案感兴趣,如果它依赖于平台。

  • > 我刚刚安装了node.js&cli > 已安装node.js 已安装react-native-cli 并创建了一个“新项目”。 在'new_project'目录中,我想看看metro捆绑器是否工作良好。 但命令给了我以下错误和metro没有启动。有解决这个错误的线索吗?(我使用的是windows 10操作系统。) > 命令: 错误无效正则表达式:/(.\fixtures.node_module

  • 升级自制软件时遇到错误 DYLD:库未加载: /usr/local/opt/openldap/lib/libldap-2.4.2.dylib引用自: /usr/local/bin/php原因:未找到图像中止陷阱:6