我有我的自定义类型,它是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];
所以,为什么要抱怨??
答案 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]
属性。