【问题标题】:What is the purpose of the unit type in Rust?Rust 中单元类型的目的是什么?
【发布时间】:2014-09-10 14:39:50
【问题描述】:

Rust 具有 unit 类型(),这是一种具有单个零大小值的类型。此单元类型的值也使用() 指定。

单位类型及其价值的用途是什么?它是一种避免像其他语言那样使用 null(或 nil)的机制吗?

【问题讨论】:

  • 它更像是 C 语言中的void。据我所知,一切都是 rust 中的表达式,所以 () 是某些东西返回的值,它只执行它的效果。
  • 您可以制作自己的零大小类型,就像()struct MyNewZeroSizeType; 一样有用(“标记类型”!)
  • 它看起来不像 java 中的 null,因为如果你说你返回一个 int 你不能返回 () 来代替它。

标签: rust unit-type


【解决方案1】:

()() 类型的值,其目的是无用。

Rust 中的一切都是一个表达式,返回“无”的表达式实际上返回 ()。如果你有一个没有返回类型的函数但返回的不是(),编译器会报错。例如

fn f() {
    1i32 // error: mismatched types: expected `()` but found `int`
}

() 也有实际用途。有时我们并不关心泛型类型,() 明确表示了这一点。

例如,Result<(), String> 可用作函数的返回类型,该函数要么成功完成,要么因各种原因失败。

【讨论】:

  • 假设人们也可以为它定义方法,但不会有与这些相关的状态......对吗?
  • @errordeveloper 是的,你可以用() 做的几乎所有事情都有一个简单的实现。
【解决方案2】:

如果您来自类似 C 的语言(C、C++、Java 等),您可以将 unit 视为类似于 void。它是你不想返回任何东西时返回的类型。

类型理论家会指出 unit 不像 void,因为 unit 正好是 1 值,而 void 是 0 值。

实际上,您可以在两种类型中存储的信息量是相同的(0 位),尽管使用 unit 的语言往往更易于使用,因为您可以像对待任何其他值一样对待它。

您可以将它存储在变量、结构、集合或任何其他可以存储值的地方。您可以作为参数传递或将其作为结果返回。您可以创建对它的引用。等等。

那么,什么时候有用?主要是当您不关心您正在处理的价值类型时。这意味着您可以编写多态/泛型代码,而无需担心您正在处理的值是否实际包含任何信息,也就是说,无论您是存储实际数据还是(),都不需要特殊情况。

HashSet 中使用了它的一个示例。 HashSet<T> 实际上实现为a thin wrapper around HashMap<T, ()>。 (从泛型T() 的映射)

【讨论】:

  • 另一个使用领域是 Dynamic Dispatch,其中记录的 TraitObject 实现 here 具有用于数据和 vtable 的 *mut () 类型。
  • 我要补充一点,void() 也非常有用,不仅在您不关心结果时,而且在 is 没有结果时。我可能有一个存储到文件的方法,要么因错误而失败,要么在没有更多信息的情况下成功完成——Result<(), MyError>。您可能会争辩说Option<MyError> '更好',但我不同意; Result 的命名约定意味着它很清楚发生了什么。
猜你喜欢
  • 1970-01-01
  • 2017-03-11
  • 2014-03-29
  • 2021-03-19
  • 2015-06-22
  • 2015-11-01
  • 2019-09-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多