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

时间:2019-06-13 23:28:34

标签: rust

我有我的自定义类型,它是32个字节的切片:

pub type Address = [u8; 32];

因此,要显示此类型,我有一个自定义格式化程序:

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

但是我不能编译它:

error[E0117]: only traits defined in the current crate can be implemented for arbitrary types
   --> core/linix-primitives/src/lib.rs:122:1
    |
122 | impl fmt::Display for Address {
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ impl doesn't use types inside crate

我知道要实现特征,我需要具有以下两个之一:在本地定义type或在本地定义trait

好吧,我已经在本地定义了一个类型:

pub type Address = [u8; 32];

所以,为什么要抱怨??

1 个答案:

答案 0 :(得分:3)

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

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]不是本地类型。 您可能想做的就是使用所谓的newtype模式。如果您的类型可能有一些填充,则可能需要向其中添加一个#[repr]属性。