【问题标题】:What is the difference between Some and Option in Rust?Rust 中的 Some 和 Option 有什么区别?
【发布时间】:2020-10-14 21:44:17
【问题描述】:

它们是一样的吗?有时我可以看到文档使用它们就好像它们是相等的。

【问题讨论】:

    标签: types rust optional


    【解决方案1】:

    Option 类型定义为:

    enum Option<T> {
        None,
        Some(T),
    }
    

    这意味着Option 类型可以具有NoneSome 值。

    另见:

    【讨论】:

    • 这是否意味着一些关于 Rust 的文档是完全错误的?示例:static.rust-lang.org/doc/0.10/std/io/… - 有人说下一个方法总是返回 Some,而实际上它返回一个 Option。
    • 添加到这个; Option 类型的要点是表示可空(无)值,而不包括语言中的空指针概念。使用枚举意味着您必须 match {} 它,并且由于 match 表达式必须是详尽无遗的,因此您必须明确处理 None 分支。
    • @JeroenBollen - 如果它总是返回 Some,那么说它返回 Option 并没有错,因为 SomeOption
    • @JeroenBollen 它的返回值始终是Option&lt;...&gt; 类型的值。但是这种类型过于宽泛(它是由迭代器特性所要求的),因此您所指的部分会告知读者:对于某些blah,返回值始终是值Some(blah),而不是None。这就像说“这个函数总是返回 0”。 0 不是类型,它是一个值,但该语句仍然有意义。
    • @Jeroen Bollen:说一个方法总是返回一个特定的值并没有错。
    【解决方案2】:

    不,它们不一样,将它们视为相同的文档要么是错误的,要么是您的误解。 Option 是一种类型(更准确地说,泛型类型构造函数Option&lt;i32&gt; 是一种类型,Option&lt;String&gt; 也是如此)。 Some 是一个构造函数。除了作为函数fn Some&lt;T&gt;(T x) -&gt; Option&lt;T&gt;,它还用于模式匹配:

    let mut opt: Option<i32>; // type
    opt = Some(1); // constructor
    opt = None; // other constructor
    match opt {
        Some(x) => {
            // pattern
            println!("Got {}", x);
        }
        None => {
            // other pattern
            println!("Got nothing");
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-09
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      相关资源
      最近更新 更多