|
|
|
@ -150,7 +150,7 @@ src/libcore/result.rs:906:4
|
|
|
|
|
|
|
|
|
|
函数体以调用 `File::open` 函数开始。接着使用 `match` 处理返回值 `Result`,类似示例 9-4,如果 `File::open` 成功了,模式变量 `file` 中的文件句柄就变成了可变变量 `username_file` 中的值,接着函数继续执行。在 `Err` 的情况下,我们没有调用 `panic!`,而是使用 `return` 关键字提前结束整个函数,并将来自 `File::open` 的错误值(现在在模式变量 `e` 中)作为函数的错误值传回给调用者。
|
|
|
|
|
|
|
|
|
|
所以如果 `username_file` 中有了一个文件句柄,该数接着在变量 `username` 中创建了一个新 `String` 并调用文件句柄 `username_file` 的 `read_to_string` 方法来将文件的内容读取到 `username` 中。`read_to_string` 方法也会返回一个 `Result`,因为它可能会失败,哪怕是 `File::open` 已经成功了。所以我们需要另一个 `match` 来处理这个 `Result`:如果 `read_to_string` 成功了,那么这个函数就成功了,并返回文件中的用户名,它现在位于被封装进 `Ok` 的 `username` 中。如果`read_to_string` 失败了,则像之前处理 `File::open` 的返回值的 `match` 那样返回错误值。不过并不需要显式地调用 `return`,因为这是函数的最后一个表达式。
|
|
|
|
|
所以,如果在 `username_file` 中有一个文件句柄,该函数随后会在变量 `username` 中创建一个新的 `String` 并调用文件句柄 `username_file` 上的 `read_to_string` 方法,以将文件的内容读入 `username`。`read_to_string` 方法也返回一个 `Result`,因为它可能会失败,哪怕是 `File::open` 已经成功了。因此,我们需要另一个 `match` 来处理这个 `Result`:如果 `read_to_string` 执行成功,那么这个函数也就成功了,我们将从文件中读取的用户名返回,此时用户名位于被封装进 `Ok` 的 `username` 中。如果 `read_to_string` 执行失败,则像之前处理 `File::open` 的返回值的 `match` 那样返回错误值。然而,我们无需显式调用 `return` 语句,因为这是函数的最后一个表达式。
|
|
|
|
|
|
|
|
|
|
调用这个函数的代码最终会得到一个包含用户名的 `Ok` 值,或者一个包含 `io::Error` 的 `Err` 值。我们无从得知调用者会如何处理这些值。例如,如果他们得到了一个 `Err` 值,他们可能会选择 `panic!` 并使程序崩溃、使用一个默认的用户名或者从文件之外的地方寻找用户名。我们没有足够的信息知晓调用者具体会如何尝试,所以将所有的成功或失败信息向上传播,让他们选择合适的处理方法。
|
|
|
|
|
|
|
|
|
|