当前位置: 首页 > 知识库问答 >
问题:

为什么Rust有struct和enum?

刘修能
2023-03-14

Rust的枚举是代数数据类型。据我所知,这似乎包含了struct是什么。struct有什么不同之处需要保留它?

共有3个答案

缑泓
2023-03-14

不是100%正确,但是另一种很好的思考方式:enum实际上并不优于struct,语法糖只是让它看起来像是这样。

enum是一种求和类型,意味着它的值是一组其他类型之一的值。结果

enum Animal {
    // without syntax sugar
    Cat(i32),  
    // desugars to `Dog(())` (empty tuple/unit) 
    Dog,
    // desugars to `Horse((i32, bool))` (tuple)
    Horse(i32, bool),
    // desugars to `Eagle(GeneratedEagleType)` and a struct definition outside
    // of this enum `struct GeneratedEagleType { weight: i32, male: bool }`
    Eagle { weight: i32, male: bool }
}

因此,如果每个enum变量只与一种类型关联就足够了。在这种情况下,enum并不优于struct,因为它不能构造产品类型(如struct)。

能够在枚举变量定义中写入“类型定义”只是为了方便。

另外:struct也优于“tuple-structs”和“tuple”。如果我们忽略这三个名字,这三件事几乎是等价的。但为了方便起见,Rust仍然有这三种不同的类型。

请注意,我不知道这些枚举定义是否实际上是语法糖。但他们可能是,这可能有助于思考。它

邓欣可
2023-03-14

首先,Rust具有广泛的数据类型:

  • 带有命名字段的结构(struct Foo{bar:uint}
  • 元组结构(structfoo(pub-Bar,Baz)
  • 没有字段的结构(struct Foo;
  • 枚举,具有各种类型的变体:
    • 没有字段的变体(例如None
    • 元组变体(例如Some(T)
    • 结构变量(例如一些{pub-inner:T}

    这为程序员定义数据类型提供了一些灵活性。通常,您不需要命名字段,尤其是当结构/变量只有一个字段时。Rust允许您在这种情况下使用元组结构/元组变体。

    如果将结构从锈迹中移除,则不会丢失功能,可以再次使用带有结构变体的枚举。但是会有大量的单变量枚举,使用起来既不必要又麻烦。

单于庆
2023-03-14

首先,你是正确的,在语义上enum在表示什么方面严格优于struct,因此struct有些冗余。

然而,这里还有其他因素在起作用。

>

区别:一个enum是一个带标签的联合体,一个struct有一个固定的布局;我们(程序员)通常喜欢在东西上贴标签,因此给不同的功能赋予不同的名称是值得赞赏的。

在我看来,struct因此是语法糖。我通常更喜欢瘦肉型的,但一点糖可以大大增加简洁的表达。

 类似资料:
  • 问题内容: 给定以下结构: 在结构中使用指针或值时,性能方面有何不同?是否有开销,或者这仅仅是两门Go编程课程? 我将使用指针来实现链接的结构,但这是我们唯一必须在结构中使用指针以获得性能的情况吗? PS:在上面的结构中,我们讨论了一个简单的int,但是它可以是任何其他类型(甚至是自定义类型) 问题答案: 使用对您的程序功能最有用的表格。基本上,这意味着如果将值设为有用,则使用指针。 从性能的角度

  • 本文向大家介绍iOS 类(class)和结构体(struct)有什么区别?相关面试题,主要包含被问及iOS 类(class)和结构体(struct)有什么区别?时的应答技巧和注意事项,需要的朋友参考一下 先了解一下什么叫类? 类(Class)是面向对象程序设计实现信息封装的基础。类是一种用户定义类型,也称类类型。每个类包含数据说明和一组操作数据或传递消息的函数。类的实例称为对象。类是面向对象程序设

  • 问题内容: 切片是对基础数组的引用。这是有道理的,似乎可以在内置/原始类型上使用,但是为什么不能在结构上使用呢?我假设即使我更新了一个struct字段,引用/地址也仍然相同。 需要说明的是:我知道我可以在两种情况下都使用指针。我只是对为什么不更新结构感兴趣(与int不同)。 问题答案: 调用时要做的是传递一个包含值副本的新数组,并立即丢弃该数组。这与您使用基元不同,因为您保留了数组。 这里有两种方

  • 如果我在Rust中运行这些基准测试: 结果是: 每次通话121-6=115纳秒。 但Java的基准相同: 给我: Rust中的原木速度约为Java中的3.7倍(115/31)。 当我测试斜边实现()时,Rust中的实现速度是Java中的15.8倍。 我是否编写了糟糕的基准测试,或者这是一个性能问题? 回复评论中提出的问题: > 我使用总是在发布模式下运行的运行Rust的基准测试。 Java基准测试

  • 虽然Rust中的所有整数类型都实现了强调总排序的,但浮点类型只实现了。这意味着可能存在无法比较的浮点值。这似乎很难理解,因为浮点数可以被认为是实数的近似值,实数碰巧是一个完全有序的集合。即使加上正无穷大和负无穷大,也会使实数集保持完全有序。为什么在铁锈这个奇怪的选择? 这种限制意味着通用排序/搜索算法只能假设数字的部分排序。IEEE 754标准似乎提供了一个总排序谓词。 NaN在通用代码中是个大问