rust eclipse 类型别名默认实现

5us2dqdw  于 2022-12-19  发布在  Eclipse
关注(0)|答案(1)|浏览(151)

我知道你不能为当前crate中没有实现的类型实现Default trait,为什么你不能把那些类型别名为内部使用的类型并实现它呢?

use std::collections::HashMap;

pub type MyPortMappings = HashMap<&'static str, (u32, &'static str)>;

impl Default for MyPortMappings {
    fn default() -> Self {
        let mut m = HashMap::new();
        m.insert("ftp", (21, "File Transfer Protocol"));
        m.insert("http", (80, "Hypertext Transfer Protocol"));
        m
    }
}

fn main() {}

错误:

error[E0117]: only traits defined in the current crate can be implemented for types defined outside of the crate
 --> src/main.rs:5:1

在自己的控制下实现默认值没有意义吗?
Playground

1u4esq0p

1u4esq0p1#

这是因为类型别名只是别名,而不是单独的类型。要创建独立的类型,请使用structenumunion之一。您也可以使用Delegate crate将字段的方法委托给结构体本身。
答案一:
创造一个结构!

pub struct MyPortMappings(HashMap<&'static str, (u32, &'static str)>);

impl MyPortMapping {
    ... boilerplate and associated items...
}

impl Default for MyPortMappings {
    fn default() -> Self {
        let mut m = HashMap::new();
        m.insert("ftp", (21, "File Transfer Protocol"));
        m.insert("http", (80, "Hypertext Transfer Protocol"));
        Self(m)
    }
}

但是在你的例子中,最好是实现一个返回所需值的函数,或者创建一个trait,如果你需要它成为一个方法的话,在这种情况下创建另一个类型是不必要的。

相关问题