【问题标题】:What's a unique/special case that requires tuple variants in an enum?什么是需要枚举中的元组变体的独特/特殊情况?
【发布时间】:2020-08-16 13:34:56
【问题描述】:

来自Rust tutorial,类型可以用struct来定义

enum Shape {
    Circle { center: Point, radius: f64 },
    Rectangle { top_left: Point, bottom_right: Point }
}

和非结构/元组类型枚举(感谢@ÖmerErden 提供正确的命名)

enum Shape {
    Circle(Point, f64),
    Rectangle(Point, Point)
}

据我所知,两者是相同的,在匹配中具有完全相同的用例等。但是结构之一强制您使用命名属性,而非结构强制您使用有序参数。

在使用或输出(性能、内存占用等)方面,我还缺少什么其他区别吗?还是后者只是结构的惰性语法版本,编译后具有确切的结果?

【问题讨论】:

  • 这是元组 => let x = (3, 5, 4),这是元组结构 => struct Circle(Point, f64) 并且 Rust 中没有类
  • 您链接到的“Rust 教程”来自 Rust 0.9...许多东西在 0.9 和 1.0 之间发生了变化(在语法和标准库中),所以你会发现一些过时的东西在这。我建议您阅读book,如果您还没有阅读的话。
  • 两种表单在运行时应该没有明显的差异。但这并不特定于枚举,这同样适用于一般的元组结构与普通结构。

标签: rust


【解决方案1】:

我只发现了两个明显的用法:

  • 用最少的样板来包装一个类型,所以每次你需要深入到被包装的对象时,它只是self.0
struct MyString(String);
  • .0.1 等语法增加了清晰度,而命名字段不能这样做(因为标识符不能从数字字符开始,特别是不能是数字字符串

【讨论】:

  • 你可以使用self.0 访问枚举变量的字段吗?
  • 这是具有一个值的 Tuple Struct 的特例,而不是元组枚举的特例。手册说“对于具有单个字段的元组结构有一种特殊情况,有时称为newtypes
猜你喜欢
  • 1970-01-01
  • 2012-05-11
  • 2021-11-10
  • 1970-01-01
  • 2015-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-23
相关资源
最近更新 更多