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因为在写这篇文章的时候可能会有填充,所以我的意思是为了节省一些空间,但我想编译器通常知道得最好。