Traits 当trait和type都不在此板条箱中时提供实现

Traits 当trait和type都不在此板条箱中时提供实现,traits,rust,Traits,Rust,我想为原语类型u8提供traitToHex(不是我定义的,来自serialize)的实现: u8的impl-ToHex{ fn到_十六进制(&self)->字符串{ 自整定根(16) } } 问题是我遇到了以下编译器错误: error: cannot provide an extension implementation where both trait and type are not defined in this crate 我理解这个错误的原因及其逻辑,这是因为trait和primi

我想为原语类型
u8
提供trait
ToHex
(不是我定义的,来自
serialize
)的实现:

u8的impl-ToHex{ fn到_十六进制(&self)->字符串{ 自整定根(16) } } 问题是我遇到了以下编译器错误:

error: cannot provide an extension implementation where both trait and type are not defined in this crate

我理解这个错误的原因及其逻辑,这是因为trait和primitive类型都在我的代码外部。但是我如何处理这种情况并为
u8
提供
ToHex
实现呢?更一般地说,您如何处理此类问题,在我看来,这个问题一定很常见,并且应该可以很容易地扩展这样的类型?

您应该使用一个新的类型结构来实现这一点:

pub结构U8(pub U8)
U8的impl ToHex{
fn到_十六进制(&self)->字符串{
设U8(x)=*self;
x、 to_str_基数(16)
}
}
但是,这意味着您应该将
u8
包装到
u8
中,您需要在其中执行此转换:

设x:u8=127u8
//普林顿!(“{}”,x.to_hex());//不编译
普林顿!(“{}”,U8(x).to_hex());

就性能而言,这是完全免费的。

我意识到这已经快一年了,但答案从未被接受,我想我已经找到了另一种解决方案,我认为最好在这里记录下来

为了通过trait扩展u8的功能,而不是尝试将扩展到hex,为什么不创建一个新trait

trait MyToHex {
    fn to_hex(&self) -> String;
}

impl MyToHex for u8 {
    fn to_hex(&self) -> String {
        format!("{:x}", *self)
    }
}
然后像这样使用

fn main() {
    println!("{}", (16).to_hex());
}
这样做的好处是,您不必使用新的多余数据类型来包装每个u8变量


缺点是您仍然无法在需要ToHex特性的外部函数(即std库或您无法控制的函数)中使用u8(Vladimir Matveev的解决方案在这种情况下有效),但从OP来看,您似乎只想在代码内部扩展u8

这是您提出的一个很好的破解方法。但在我的例子中,我担心这样包装我使用的所有基本类型会有点太麻烦。@user3762625,这不是一个hack,事实上这是唯一可能的方法。您不能将您不拥有的trait的trait实现添加到您不拥有的类型中,并且除了新类型之外没有其他解决方法。@user3762625:在本例中,直接为
u8
使用
to_hex
自由函数(您可以定义)会更简单;只有在需要传递
u8
时,才真正需要换行,其中需要
ToHex