我知道你不能为当前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
在自己的控制下实现默认值没有意义吗?
1条答案
按热度按时间mm9b1k5b1#
这是因为类型别名只是别名,而不是单独的类型。您需要使用
struct
、enum
或union
创建自己的 Package 器。下面是使用newtype习惯用法的替代方法:
您还可以使用Delegate crate将字段的方法委托给struct本身。
但是在你的例子中,最好是实现一个返回所需值的函数,或者创建一个trait,如果你需要它成为一个方法的话,在这种情况下创建另一个类型是不必要的。