【发布时间】:2014-12-09 13:02:07
【问题描述】:
在 Go 中,您可以执行以下操作来定义一个隐藏现有类型的自定义类型:
type Header map[string][]string
然后,您可以像访问 map[string][]string 一样访问 Header 类型。
我尝试对 Rust 做同样的事情,但我遇到了问题:
pub type Header = collections::HashMap<String, Vec<String>>;
fn main() {
let h = Header::new();
}
您可以调用 HashMap::new()、as the docs indicate(2014 年 12 月 8 日访问)。为什么我不能调用 Header::new()?
【问题讨论】:
-
值得注意的是,你也不能 impl Header { fn new() -> Header } 因为: ' 不能将方法与定义类型的 crate 之外的类型相关联;定义并实现一个特征或新类型 [E0116]' 这对我来说就像一个错误。
-
@Doug:纯属别名;
impl Header { … }完全等同于impl HashMap<String, Vec<String>> { … }。那里没有错误。 -
@ChrisMorgan 如果它是一个正确的别名(例如,使用 foo::Bar 作为 Foo),您可以毫无问题地使用 Foo::new()。这肯定是一个错误,这不起作用?
-
@Doug:它本质上不是一个错误;它只是行为不同的东西。它已经定义了一个类型别名,仅此而已。
-
(它可能没有达到您的预期,但这并不构成错误 - 您绘制的平行线只是平行线,两者绝对不同。)