【问题标题】:What is this unwrap thing: sometimes it's unwrap sometimes it's unwrap_or这是什么 unwrap 东西:有时是 unwrap 有时是 unwrap_or
【发布时间】:2014-01-21 12:06:08
【问题描述】:

注意这个问题中关于read_line~str 的细节与Rust 1.0 之前的版本有关。关于unwrapunwrap_or 的一般概念仍然适用。

我在阅读Rust for Rubyists时遇到了它,即:

let mut reader = BufferedReader::new(io::stdin());
let input = reader.read_line().unwrap_or(~"nothing");

【问题讨论】:

    标签: rust


    【解决方案1】:

    注意此答案中关于read_line~str 的细节与Rust 1.0 之前的版本有关。关于unwrapunwrap_or 的一般概念仍然适用。

    Rust 有解释这些事情的 API 文档。

    BufferedReader.read_line:

    fn read_line(&mut self) -> Option<~str>

    读取下一行输入,解释为 UTF-8 编码的 unicode 代码点序列。如果遇到换行符,则换行符包含在返回的字符串中。

    [然后是关于提高io_error 条件的事情,这是一种将返回None 的情况——如果条件得到处理。如果不是,它就会失败,所以你永远不会得到任何回报。]

    如果阅读器中的所有内容都已阅读,您还将返回 None


    Option.unwrap:

    fn unwrap(self) -> T

    将值移出选项类型并返回。

    主要用于从选项类型中获取字符串、向量和唯一指针而不复制它们。

    也就是说,

    • Some(a).unwrap() 返回a
    • None.unwrap() 失败

    Option.unwrap_or:

    fn unwrap_or(self, def: T) -> T

    返回包含的值或默认值

    也就是说,

    • Some(a).unwrap_or(b) 返回a
    • None.unwrap_or(b) 返回b

    【讨论】:

    • 处理过的 io_error 并不是您会看到从 read_line 返回 None 的唯一情况:我很确定当输入到达 EOF(文件结尾)时它也会返回 None,而没有发出条件信号. (我确实喜欢您对 Option 方法的具体 redex 样式解释:我会考虑将其添加到文档中)
    • @pnkfelix:你是对的。我想了想,但不知为什么没有写下来。已更正。
    【解决方案2】:

    注意此答案中关于read_line~str 的细节与Rust 1.0 之前的版本有关。关于unwrapunwrap_or 的一般概念仍然适用。

    因为read_line 可能会失败,所以它会返回Option<~str>。要获取值,您可以使用模式匹配或其中一种展开方法。

    unwrapunwrap_or 之间的区别在于,如果没有值,unwrap 将失败(None),但unwrap_or 将返回指定的默认值(在这种情况下为“nothing”)

    【讨论】:

      猜你喜欢
      • 2016-07-21
      • 1970-01-01
      • 2013-08-12
      • 2011-04-27
      • 2023-02-04
      • 2015-06-12
      • 1970-01-01
      • 2019-11-24
      • 2011-08-11
      相关资源
      最近更新 更多