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

trait在Rust中的冲突实现

黄英韶
2023-03-14

我想为

use std::convert::Into;

pub trait UiId {
    fn push(&self);
}

impl<'a> UiId for &'a str {
    fn push(&self) {}
}

impl<T: Into<i32>> UiId for T {
    fn push(&self) {}
}

fn main() {}

编译失败,出现以下错误:

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


共有2个答案

郎羽
2023-03-14

我发现了一个使用标记特征的变通方法。不需要夜间或实验功能。诀窍是,我在我的板条箱中定义了标记特征,但不导出它,所以上游板条箱不可能在除了我实现它的类之外的类上定义标记。

标记特征下方是数字

我使用它是为了可以将任何可以转换为f64的对象实现为,但也可以将其实现为单独impl中的字符串以及其他类型。

Numerictrait必须是pub,因为它们警告将来的版本将禁止在公共接口中使用私有trait。


use std::convert::Into;

pub trait Numeric {}
impl Numeric for f64 {}
impl Numeric for f32 {}
impl Numeric for i64 {}
impl Numeric for i32 {}
impl Numeric for i16 {}
impl Numeric for i8 {}
impl Numeric for isize {}
impl Numeric for u64 {}
impl Numeric for u32 {}
impl Numeric for u16 {}
impl Numeric for u8 {}
impl Numeric for usize {}


pub trait UiId {
    fn push(&self);
}

impl<'a> UiId for &'a str {
    fn push(&self) {}
}

impl<T: Into<i32> + Numeric> UiId for T {
    fn push(&self) {}
}

司马飞
2023-03-14

因此,如果允许这样做,可能的破坏将使向库特性添加实现变得更加困难。

不幸的是,我找不到留档,无论是在生锈编程语言书还是在参考手册。

我能找到的最好的是RFC 1023,它说一个板条箱[...]不能依赖那个Type:!Trait保持不变,除非TypeTrait是本地的。

 类似资料:
  • 我有广泛的基本特征。有些类型只关心其功能的子集,所以我添加了一个子集,要求用户实现更小的功能集。 此代码失败: 出现以下错误: 有趣的是,当我删除上的通用性时,它就起作用了: stackoverflow上的其他一些帖子也提到了类似的问题,但它们通常都有关于外来特征的问题(来自标准库的)。在我的案例中,特质和类型都是本地的,因此就我所知,孤儿规则不应该生效。 基本上,错误提到下游板条箱可能实现tra

  • 更新:我并不是唯一一个思考这个问题的人,它似乎确实是一个错误。看这里。这一天是固定的将是一个梦幻般的一天!:) 这是从

  • 小雪再 pull 的时候遇到了冲突。 → git pull --rebase remote: Counting objects: 3, done. remote: Compressing objects: 100% (2/2), done. remote: Total 3 (delta 1), reused 3 (delta 1), pack-reused 0 Unpacking objects

  • Postgres 10和11的插入说明: 关于冲突[冲突目标]冲突行动 我有一张桌子: 而我想做的 但是我得到一个错误: ON CONFLICT DO UPDATE需要推理规范或约束名称提示:例如,ON CONFLICT(column_name) 为什么我必须提供一个确定的目标?如何提供主键或其他列集?

  • 我试图在生锈中编写一些通用的数学函数,我一直遇到以下错误消息: 有可能解决这个问题吗?如果是,怎么做? 例如,我正在尝试编写一个通用的点积,它使用两个迭代器,对它们进行压缩,并对这些迭代器对进行迭代,以累积积。我希望这个函数也能计算复数点积。复数上的点积包括共轭一面。我的第一个想法是为一个二进制函数编写一个trait,以替换,因为它还与左侧参数共轭。以下是完整的代码: 因为一个

  • 问题内容: 创建Elasticsearch Client时,出现异常java.lang.NoSuchMethodError:com.google.common.util.concurrent.MoreExecutors.directExecutor()Ljava / util / concurrent / Executor; 经过一些查找之后,像Guava-18这样的接缝将在运行时被旧版本覆盖,而