Generics trait在Rust中的冲突实现

Generics trait在Rust中的冲突实现,generics,rust,traits,Generics,Rust,Traits,我想为&'a str和小于等于i32的整数实现一个自定义特征,但Rust不允许我: 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) {} }

我想为
&'a str
和小于等于
i32的整数实现一个自定义特征,但Rust不允许我:

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() {}
使用std::convert::Into;
pub-trait-UiId{
fn推送(和自推);
}
impl src/main.rs:11:1
|

7 | impl未考虑到
&'a str
未将
实现到
中的事实,因为不能保证以后不能添加。这将破坏您的代码

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

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


我能找到的最好的答案是,这说明板条箱[…]不能依赖于
类型:!Trait
有效,除非
类型
Trait
是本地的。

我找到了一个使用标记Trait的解决方法。无需夜间或实验性功能。诀窍是我在我的板条箱中定义标记特征,而不导出它,因此上游板条箱不可能在我实现它的类之外的类上定义标记

标记特征下方是
数字

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

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


使用std::convert::Into;
发布特性数值{}
f64{}的impl Numeric
f32{}的impl Numeric
i64{}的impl Numeric
i32{}的impl Numeric
i16{}的impl Numeric
i8{}的impl Numeric
isize{}的impl Numeric
u64{}的impl Numeric
u32{}的impl Numeric
u16{}的impl Numeric
u8{}的impl Numeric
使用{}的impl Numeric
pub-trait-UiId{
fn推送(和自推);
}

implI认为Rust决定实现是否重叠(或可能重叠)的方式一定有局限性,但我还没有找到明确规定规则的地方-(哦,对于一个合适的语言规范!我实际上不认为这是真的。这不是孤立规则的作用吗?你不能为一个外部类型添加外部trait
impl
s。必须在当前的板条箱中定义trait和type中的至少一个…以便让编译器对这样的情况进行推理,我想。@LukasKalbertodt看不到我的编辑。我想这句话和RFC1023中的Opan规则是同一句话。哦,的确,这听起来很合理。谢谢!