本文介绍了Rust中特征的相互矛盾的实现的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想为 c>不会执行进入< i32> 不会被考虑在内,因为不能保证它以后不能添加。这会破坏你的代码。



所以如果允许这种情况发生,可能会导致将实现添加到库特征中变得更加困难。



不幸的是,我找不到这方面的文档,无论是在书籍也不在中。



我能找到的最好是,其中说 crate不能依赖类型:!Trait 除非类型或 Trait 是本地的。


I want to implement a custom trait for &'a str and for integer numbers up to i32, but Rust does not allow me to:

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() {}

This fails to compile with the following error:

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

&'a str does not implement Into<i32>. Is it possible to implement UiId for &'a str and everything that can be converted into i32 without specifying concrete types? How can I do that?

解决方案

The fact that &'a str does not implement Into<i32> is not taken into account, because there is no guarantee that it couldn't be added later. This would then break your code.

So if this were allowed the possible breakage would make it harder to add implementations to library traits.

Unfortunately I couldn't find documentation for that, neither in The Rust Programming Language Book nor in the Reference Manual.

The best I could find is RFC 1023, which says that a crate [...] cannot rely that Type: !Trait holds unless Type or Trait is local.

这篇关于Rust中特征的相互矛盾的实现的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-20 02:58