【问题标题】:Redefining types in Rust and calling functions on them在 Rust 中重新定义类型并在其上调用函数
【发布时间】: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&lt;String, Vec&lt;String&gt;&gt; { … }。那里没有错误。
  • @ChrisMorgan 如果它是一个正确的别名(例如,使用 foo::Bar 作为 Foo),您可以毫无问题地使用 Foo::new()。这肯定是一个错误,这不起作用?
  • @Doug:它本质上不是一个错误;它只是行为不同的东西。它已经定义了一个类型别名,仅此而已。
  • (它可能没有达到您的预期,但这并不构成错误 - 您绘制的平行线只是平行线,两者绝对不同。)

标签: types rust


【解决方案1】:

type 别名纯粹是 type 的别名。它根本没有命名空间的别名,所以你仍然需要写HashMap::new()

【讨论】:

  • 我想我听到一些核心开发人员说它打算“在某个时候”工作,你有什么信息吗?
  • 我没有关于该主题的更多信息。这样的东西几乎是向后兼容的,但并不完全兼容(除了添加方法可能产生的不兼容之外,别名上的任何 impl 都可能停止在基本类型上工作,具体取决于它的实现方式)。
猜你喜欢
  • 2022-11-22
  • 2020-03-04
  • 2015-07-05
  • 1970-01-01
  • 2020-02-12
  • 2021-05-12
  • 1970-01-01
  • 2020-12-27
  • 1970-01-01
相关资源
最近更新 更多