rust 为什么不能使用类型别名来实现外部类型的traits?

0g0grzrc  于 2023-01-13  发布在  其他
关注(0)|答案(1)|浏览(254)

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

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
    }
}
error[E0117]: only traits defined in the current crate can be implemented for types defined outside of the crate
 --> src/lib.rs:5:1
  |
5 | impl Default for MyPortMappings {
  | ^^^^^^^^^^^^^^^^^--------------
  | |                |
  | |                `HashMap` is not defined in the current crate
  | impl doesn't use only types from inside the current crate
  |
  = note: define and implement a trait or new type instead

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

mm9b1k5b

mm9b1k5b1#

这是因为类型别名只是别名,而不是单独的类型。您需要使用structenumunion创建自己的 Package 器。
下面是使用newtype习惯用法的替代方法:

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

您还可以使用Delegate crate将字段的方法委托给struct本身。
但是在你的例子中,最好是实现一个返回所需值的函数,或者创建一个trait,如果你需要它成为一个方法的话,在这种情况下创建另一个类型是不必要的。

相关问题