【问题标题】:What do the keywords "Some" and "Simple" do in Rust?Rust 中的关键字“Some”和“Simple”有什么作用?
【发布时间】:2018-05-21 03:15:18
【问题描述】:

我试图通过给自己一个有针对性的任务来养成更多的编程习惯,而我发现create a toy layout engine 的那个似乎是一个很好的匹配。由于我专注于学习 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 一词的作用。我尝试过查看the official Rust documentation,但我找不到这些术语的描述,即使文档中使用了Some

这些术语有什么作用?更一般地说,是否有 Rust 关键字列表?搜索“rust 编程语言关键字”似乎没有帮助。

【问题讨论】:

  • 嗯,你有一种奇怪的语言组合要同时学习。 Rust 和 Python 非常 不同,不仅在语法上,而且数据模型也非常不同(正如您可能从答案中了解到的那样)。
  • 很公平,虽然我的问题更多是关于这些词的确切含义,因为我找不到任何解释它们的实际文档。

标签: rust


【解决方案1】:

Rust 的特征 Algebraic Data Types 简而言之是具有多种可能形状的数据类型,例如:

 enum OptionInt {
     None,
     Some(i32),
 }

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

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

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

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

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

此功能也称为标记联合

【讨论】:

  • 这并没有真正向我解释 Some 的作用。 Some(int) 和 int 有什么区别?
  • 关于匹配示例,我是否正确地理解为“匹配名为 an_option_int 的变量。如果它是整数类型,则...否则,返回 0。”我想我并没有真正理解 2i 和 Some(2i) 之间的区别。
  • 2i 是一个整数。 Some(2i) 是一个模式(在=&gt; 的左侧)或一个表达式(在=&gt; 的右侧),当一个表达式构造一个OptionInt 类型的值时值为Some(2i),其内存表示有点像元组(Some, (2i)):第一个元素标识类型——NoneSome——第二个元素是内容——() if None,如果Some,则为(2i)。我建议您阅读有关代数数据类型的更多信息,它们是许多函数式编程语言的重要组成部分。 Corey 还提供了该指南的链接。
  • @Simon Rose 我不知道 Rust,但从答案来看,OptionInt 看起来像 Haskell 的 Maybe。如果是这种情况, Some 表示可能失败的计算结果。如果确实失败了,它将返回 None (表示空值),如果成功则返回 Some (值)。您应该能够使用模式匹配打开 OptionInt 以获得“正常 int”。您可以通过允许函数返回一个值或全局 Null 值(如果它失败)在 Python 中对此进行建模,然后在“如果结果不是 == null”的行之后进行检查(或者无论如何会这样写在 Python 中)。
  • @SimonRose:另一个可能对您有帮助的例子:enum Outcome { Success(String), Error(String) }。在这里,Outcome 枚举的两个变体都包含相同类型的数据(String),只是它们的变体名称发生了变化(SuccessError)。
【解决方案2】:

这些不是关键字,它们为枚举的变体命名。 Relevant section in the guide。关键字列表is in the reference

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-19
    • 1970-01-01
    • 2016-11-07
    • 2019-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-12
    相关资源
    最近更新 更多