rust - 什么是有和无?

标签 rust option-type

我使用 Vec::get 遇到了一些我不理解的输出。这是代码:

fn main() {
    let command = [('G', 'H'), ('H', '5')];

    for i in 0..3 {
        print!(" {} ", i);
        println!("{:?}", command.get(i));
    }
}

输出是

 0 Some(('G', 'H'))
 1 Some(('H', '5'))
 2 None

我以前接触过 Haskell,我的意思是看一个教程网站 10 分钟然后又回到 C++,但我记得读过一些关于 SomeNone 用于 Haskell。我很惊讶在 Rust 中看到这个。有人可以解释为什么 .get() 返回 SomeNone 吗?

最佳答案

get的签名(对于切片,不是 Vec ,因为您使用的是数组/切片)是

fn get(&self, index: usize) -> Option<&T>

也就是说,它返回一个 Option ,这是一个定义如下的枚举

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

NoneSome是枚举的变体,即类型为 Option<T> 的值可以是 None , 或者它可以是 Some包含 T 类型的值.您可以创建 Option枚举也使用变体:

let foo = Some(42);
let bar = None;

这个和核心一样data Maybe a = Nothing | Just a输入 Haskell;两者都代表一个可选值,它要么存在(Some/Just),要么不存在(None/Nothing)。

当失败的原因只有一种可能性时,这些类型通常用于表示失败,例如 .get使用 Option提供类型安全的边界检查数组访问:它返回 None (即没有数据)当索引超出范围时,否则返回 Some包含请求的指针。

另见:

关于rust - 什么是有和无?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24771655/

相关文章:

ios - 使用 dispatch_async() 时 Swift 中的 Optionals 问题

ios - 可选链接不适用于可选协议(protocol)要求

rust - 搜索BST节点的Successor, "clone to satisfy borrow checker"灾难

rust - 有没有一种方法可以简化没有宏将Option转换为Result的方法?

iterator - Chars 上的 flat_map 导致借用检查器错误

rust - 在 Rust 中,Box :ed struct compared to a plain struct? 的放置顺序是否存在差异

java - 如果不存在,Scala 和 Java 选项会执行其他操作

generics - 通用类型引用的 Rust 约束

swift - 如何保证 inout 参数不会改变 Type 并且不会在函数中变成 nil

java - 'Optional.get()' without ' isPresent()'检查