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

Sim*_*ose 3 rust

我试图通过给自己一个定向任务来获得更多的编程习惯,而我发现创建玩具布局引擎的那个似乎是一个很好的匹配.由于我专注于学习Python,我认为将教程转换为Python是一种很好的做法.我想同时,这会教我一些关于Rust的内容,以及一般的阅读代码.一场胜利!

我很难理解关键字(甚至是关键字?)SomeSimple做什么.它们出现在提供的代码中:

enum Selector {
    Simple(SimpleSelector),
}

struct SimpleSelector {
    tag_name: Option<String>,
    id: Option<String>,
    class: Vec<String>,
}
Run Code Online (Sandbox Code Playgroud)

我认为枚举是一种存储数据的方式,可能(确切地)是几种可能的类型之一,但我不明白这意味着什么.

作者代码中出现的另一件事是(例如)

match self.next_char() {
    '#' => {
        self.consume_char();
        selector.id = Some(self.parse_identifier());
    }
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我不知道该术语的Some作用.我已经尝试查看官方Rust文档,但我找不到这些术语的描述,即使Some在文档中使用!

这些术语有什么作用?更普遍的是有一个Rust关键字列表?不寻找"生锈编程语言关键词"似乎有所帮助.

Mat*_* M. 8

Rust具有代数数据类型,简而言之就是具有多种可能形状的数据类型,例如:

 enum OptionInt {
     None,
     Some(i32),
 }
Run Code Online (Sandbox Code Playgroud)

是一种数据类型None(单例值)还是Some(i32)(a i32).在这种情况下,None并且Some数据构造函数:当应用于值(或在没有任何值的情况下None)时,它们产生类型的值OptionInt.

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

match an_option_int {
    Some(an_integer) => 3 * an_integer,
    None => 0
}
Run Code Online (Sandbox Code Playgroud)

是一个表达式,它将生成一个i32:

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

此功能也称为标记联合.

  • `2i`是一个整数.`some(2i)`是一个模式(在`=>`的左侧)或一个表达式(在`=>`的右侧),当一个表达式*构造*一个类型为`OptionInt的值'使用值'Some(2i)`,其内存表示将有点像元组`(Some,(2i))`:第一个元素标识类型 - "无"或"有些" - 和第二个元素是内容 - `()`如果是'None`,`(2i)`如果`Some`.我建议你阅读更多有关代数数据类型的内容,它们是许多函数式编程语言的重要组成部分.Corey还提供了指南的链接. (3认同)
  • @Simon Rose我不知道Rust,但从答案来看,OptionInt看起来像是Haskell的Maybe.如果是这种情况,则Some表示可能失败的计算结果.如果它失败了,它将返回None(表示空值),如果成功则返回Some(value).您应该能够使用模式匹配来打开OptionInt以获得"正常int".你可以通过允许一个函数返回一个值来模拟这个,或者如果它失败则可以在全局Null值中建模,然后在"if result not == null"之后做一个检查(或者不管怎么说)在Python). (3认同)
  • 那并没有真正向我解释一些人的所作所为。Some(int)和int有什么区别? (2认同)
  • @SimonRose:另一个可能对你有帮助的例子:`enum Outcome {Success(String),Error(String)}`.这里,'Outcome`枚举的两个变体包含相同类型的数据(一个`String`),只有它们的变体名称改变(`Success`和`Error`). (2认同)

Cor*_*son 4

这些不是关键字,它们为枚举的变体命名。指南中的相关部分。关键字列表位于参考文献中