使用Rust枚举实现什么功能有意义?

使用Rust枚举实现什么功能有意义?,rust,enums,Rust,Enums,在阅读了Rust编程语言之后,我在理解Rust枚举的有用性方面遇到了问题 在本段中,我们有以下内容: 如果我们要创建一个不使用状态模式的替代实现,我们可以在Post上的方法中,甚至在检查Post状态并更改这些位置行为的main代码中,使用match表达式。这意味着我们将不得不在几个地方寻找,以了解一篇文章在出版状态下的所有含义!这只会增加我们添加的更多状态:每个match表达式都需要另一个arm 我完全同意。由于上述原因,在这种情况下使用枚举将非常糟糕。然而,使用enum是我第一个想到的更惯用的

在阅读了Rust编程语言之后,我在理解Rust枚举的有用性方面遇到了问题

在本段中,我们有以下内容:

如果我们要创建一个不使用状态模式的替代实现,我们可以在
Post
上的方法中,甚至在检查Post状态并更改这些位置行为的
main
代码中,使用
match
表达式。这意味着我们将不得不在几个地方寻找,以了解一篇文章在出版状态下的所有含义!这只会增加我们添加的更多状态:每个
match
表达式都需要另一个arm

我完全同意。由于上述原因,在这种情况下使用枚举将非常糟糕。然而,使用enum是我第一个想到的更惯用的实现。在同一部分的后面,本书介绍了通过变量阴影使用类型编码对象状态的概念

据我所知,Rust枚举可以包含复杂的数据结构,同一
enum
的不同变体可以包含不同的类型

枚举是更好选择的设计的真实示例是什么?我只能在其他资料中找到虚假或非常简单的例子

我知道Rust在
结果
选项
中使用枚举,但这些都是非常简单的用法。我在考虑一些具有更复杂行为的功能


这是一个有点开放性的问题,但我在搜索谷歌后找不到有用的答案。如果有人能帮我重新措辞,我可以把这个问题改成一个更封闭的版本。

从广义上讲,这些选择之间的基本权衡有一个名字:“。你应该在谷歌上找到很多这样的名字,无论是在一般情况下还是在生锈的情况下

在问题的上下文中,“问题”是以这样一种方式编写代码,即添加新状态和对状态添加新操作都不涉及修改现有实现

使用trait对象时,添加状态很容易,但添加操作却很难。要添加状态,需要定义一个新类型并实现trait。要添加一个操作,简单地说,就是向trait添加一个方法,但必须侵入式地更新所有状态的trait实现

当对状态使用枚举时,很容易添加新操作,但不能添加新状态。要添加操作,需要定义一个新函数。要添加新状态,很简单,必须侵入性地修改所有现有操作以处理新状态

如果我对这一点解释得足够好,希望大家都能清楚地看到,两者都有一席之地。他们在某种程度上是双重的

有了这个镜头,当枚举上的操作预期会比备选操作发生更大的变化时,枚举将更适合。例如,假设您试图为C++表示一个抽象语法树,它每三年改变一次。相对于要在AST节点上执行的操作集,AST节点的类型集可能不会经常更改


尽管如此,在这两种情况下都有解决更困难选择的办法,但它们仍然有些困难。必须修改的代码可能不是主要问题。

enums==运行时信息。types==编译时信息一种常见用法是在性能关键型代码中,容器应该包含多个类型。例如,通过使用枚举向量,这些项在内存中非常接近,这通常会转化为更好的性能。另一个选择是使用Box或其他智能参考类型和动态特征,但是这些项目可以分散在内存中。这非常有用。枚举使添加操作变得容易,特征使添加状态变得容易。对我来说,权衡是显而易见的。也许书中使用的惯用解决方案应该改用枚举?我觉得未来
Post
接收新操作的可能性比接收新状态的可能性更大。