Rust 如何在自定义类型上实现fmt::Display?

Rust 如何在自定义类型上实现fmt::Display?,rust,Rust,我有这个自定义类型: pub type Address = [u8; 32]; 我尝试为这种类型实现fmt::Display: impl fmt::Display for Address { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { let public_key = sr25519::Public::from_raw(self); let address = pub

我有这个自定义类型:

pub type Address = [u8; 32];
我尝试为这种类型实现fmt::Display:

impl fmt::Display for Address {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        let public_key = sr25519::Public::from_raw(self);
        let address = public_key.to_ss58check();
        write!(f,"{}",address)
    }
}
但我得到了这个编译错误:

错误[E0117]:对于任意类型,只能实现当前板条箱中定义的特征 ->core/linix原语/src/lib.rs:122:1 | 122 | impl fmt::显示地址{ |^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 我明白,要实现一个trait,我需要有两种方法中的一种:要么本地定义一个类型,要么本地定义一个trait

我已经在本地定义了类型:

pub type Address = [u8; 32];

那么,为什么会出现编译错误?

这里的问题是,以下内容没有声明新类型:

pub type Address = [u8; 32];
而是一个类型别名,它更接近c样式的typedef。这意味着您的代码将转换为以下内容:

impl fmt::Display for [u8; 32] {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        let public_key = sr25519::Public::from_raw(self);
        let address = public_key.to_ss58check();
        write!(f,"{}",address)
    }
}
这里,[u8;32]不是本地类型。
您可能需要使用所谓的模式。您可能需要添加一个[repr]如果您的类型可能有一些填充,则将属性设置为该属性。

是的,看起来reprttransparent就是我想要的need@Nulik…或者你可以使用所谓的newtype模式,在这个模式上你可以实现任何类型的trait.hmm,reprtTransparent不起作用,我得到了这个错误:预期的数组是32个元素,找到了你可能想要的结构地址添加一个[reprttransparent]对此。-这是一个糟糕的建议。几乎没有人会想使用布局表示法,除非他们正在做像mem::transmute这样的事情。有关此建议的影响示例,请参阅。@hellow@shepmaster我添加了建议的更改,我很久没有接触过c了,所以我忘记了typedefs。我推荐了ad因为在写这篇文章的时候可能会有填充,所以我的意思是为了节省一些空间,但我想编译器通常知道得最好。