Rust中的关键字"Some"和"Simple"有什么作用?

6
我正在尝试通过给自己指定的任务来习惯编程,我发现创建一个玩具布局引擎似乎是一个很好的选择。由于我专注于学习Python,我认为将教程转换为Python会是一个不错的练习。同时,这也会教我一些关于Rust和阅读代码的知识。多赢啊!
我很难理解关键字(它们是否是关键字?)SomeSimple的作用。它们出现在所呈现的代码中:
enum Selector {
    Simple(SimpleSelector),
}

struct SimpleSelector {
    tag_name: Option<String>,
    id: Option<String>,
    class: Vec<String>,
}

我了解枚举是一种存储可能有多种类型之一的数据的方式,但我不明白这在这里意味着什么。
作者代码中出现的另一件事情是(例如)。
match self.next_char() {
    '#' => {
        self.consume_char();
        selector.id = Some(self.parse_identifier());
    }

在这种情况下,我不知道术语Some是什么意思。我已经尝试查阅官方Rust文档,但是即使文档中使用了Some,我也找不到这些术语的描述!
这些术语是做什么用的?更普遍地说,是否有Rust关键字列表?搜索“rust编程语言关键字”似乎没有帮助。

1
嗯,你选择了一种奇怪的同时学习的语言组合。Rust和Python非常不同,不仅在语法上有差异,数据模型也相当独特(正如你可能从答案中学到的)。 - Jonas Schäfer
好的,虽然我的问题更多地是关于这些词究竟意味着什么,因为我找不到任何真正解释它们的文档。 - Simon Rose
这似乎已经有一段时间没有得到回答了。 - Zigzagas
关于 SomeOption 类型的官方文档相当不错... https://doc.rust-lang.org/std/option/ - dat
3个回答

10

Rust具有代数数据类型的特性,简单来说,这是一种可以采用多种形式的数据类型,例如:

 enum OptionInt {
     None,
     Some(i32),
 }

OptionInt是一种数据类型,它可以是None(一个单例值)或Some(i32)(一个 i32)。在这种情况下,NoneSome是数据构造函数:当应用于值时(或在None的情况下不使用任何值),它们会产生一个OptionInt类型的值。

这些数据构造函数还会出现在模式匹配中:

match an_option_int {
    Some(an_integer) => 3 * an_integer,
    None => 0
}

是一个表达式,将生成一个i32值,该值可能是:

  • 如果an_option_int包含None,则为0
  • 如果an_option_int包含Some(2),则为6

这个特性也被称为tagged unions


13
“那并没有真正向我解释Some是做什么的。Some(int)和int之间有什么区别?” - Simon Rose
关于匹配示例,我是否正确理解为“匹配名为an_option_int的变量。如果它是整数类型,则执行...否则返回0。”我想我真的不明白2i和Some(2i)之间的区别。 - Simon Rose
3
2i是一个整数。当Some(2i)作为模式(在=>的左侧)或表达式(在=>的右侧)时,它会构造一个类型为OptionInt的值,其值为Some(2i),其内存表示形式类似于元组(Some,(2i)):第一个元素标识类型--NoneSome--第二个元素是内容--如果为None则为(),如果为Some则为(2i)。我建议您在代数数据类型上多了解一些,因为它们是许多函数式编程语言的重要组成部分。Corey还提供了指南的链接。 - Matthieu M.
5
@Simon Rose,我不懂Rust,但从答案来看,OptionInt看起来像是Haskell的Maybe。如果是这样的话,Some表示可能失败的计算结果。如果它失败了,它将返回None(表示空值),或者如果成功则返回Some(value)。你可以使用模式匹配来解开OptionInt以获取一个“正常的int”。在Python中,您可以通过允许函数返回一个值或全局的Null值(如果它失败了),然后仅仅做一次检查,比如“如果结果不等于null”(或者Python中的其他写法)来模拟这个过程。 - Carcigenicate
3
另一个可以帮助你理解的例子是:enum Outcome { Success(String), Error(String) }。在这里,Outcome 枚举的两个变量都包含相同类型的数据(一个 String),只是它们的变量名不同(SuccessError)。 - barjak

4

2

这不是一个关键字。它只是一个枚举变体,默认情况下会被导入。文档在这里

你可以在这里找到更多关于枚举如何工作的信息:https://doc.rust-lang.org/book/enums.html

Option基本上是一个可为空的类型。Rust没有null,但如果你想讨论可能不存在的值,你可以使用Option<该值的类型>。当值存在时,它将是Some(value),否则为None

示例:

let x: Option<u32> = Some(2);
assert_eq!(x.is_some(), true);

let x: Option<u32> = None;
assert_eq!(x.is_some(), false);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接