在Rust中,unwrap和unwrap_or是什么意思?

75

注意,这个问题中关于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");
2个回答

84

注意:本答案中关于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

从Option类型中移除一个值并返回它。

主要用于在不复制它们的情况下获取字符串、向量和唯一指针等选项类型的值。

也就是说,

  • 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
@pnkfelix:你说得对。我也考虑过,但不知为何没有写下来。已经更正了。 - Chris Morgan

65

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

由于read_line可能失败,因此它返回Option<~str>。要获取其中的值,可以使用模式匹配或其中一种unwrap方法。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接