@ -433,74 +433,63 @@ name = "errors1"
path = "exercises/error_handling/errors1.rs"
path = "exercises/error_handling/errors1.rs"
mode = "test"
mode = "test"
hint = "" "
hint = "" "
` Err ` is one of the variants of ` Result ` , so what the 2 nd test is saying
` Err ` 是 ` Result ` 的 成 员 之 一 , 所 以 第 二 个 测 试 的 意 思 是 ` generate_nametag_text `
is that ` generate_nametag_text ` should return a ` Result ` instead of an
应 该 返 回 ` Result ` 而 不 是 ` Option ` 。
` Option ` .
To make this change , you ' ll need to :
要 做 到 这 些 改 变 , 你 需 要 :
- update the return type in the function signature to be a Result < String , String > that
- 修 改 函 数 签 名 的 返 回 类 型 为 Result < String , String > , 以 便 能 返 回 ` Ok ( String ) ` 和 ` Err ( String ) ` 。
could be the variants ` Ok ( String ) ` and ` Err ( String ) `
- 更 改 函 数 返 回 值 ` Some ( stuff ) ` 为 ` Ok ( stuff ) ` 。
- change the body of the function to return ` Ok ( stuff ) ` where it currently
- 更 改 函 数 返 回 值 ` None ` 为 ` Err ( error message ) ` 。
returns ` Some ( stuff ) `
- 将 第 一 个 测 试 预 期 的 值 从 ` Some ( stuff ) ` 改 为 ` Ok ( stuff ) ` 。 "" "
- change the body of the function to return ` Err ( error message ) ` where it
currently returns ` None `
- change the first test to expect ` Ok ( stuff ) ` where it currently expects
` Some ( stuff ) ` . "" "
[ [ exercises ] ]
[ [ exercises ] ]
name = "errors2"
name = "errors2"
path = "exercises/error_handling/errors2.rs"
path = "exercises/error_handling/errors2.rs"
mode = "test"
mode = "test"
hint = "" "
hint = "" "
One way to handle this is using a ` match ` statement on
解 决 这 个 问 题 的 一 个 方 法 是 对 ` item_quantity . parse : : < i32 > ( ) ` 使 用 match 语 句 ,
` item_quantity . parse : : < i32 > ( ) ` where the cases are ` Ok ( something ) ` and
其 中 有 两 种 情 况 需 要 被 处 理 , 分 别 是 ` Ok ( something ) ` 和 ` Err ( something ) ` 。
` Err ( something ) ` . This pattern is very common in Rust , though , so there ' s
不 过 这 种 方 法 在 Rust 中 很 常 见 , 所 以 有 一 个 ` ? ` 操 作 符 , 作 用 几 乎 符 合 你 想 让 匹 配 语 句 做 的 事 !
a ` ? ` operator that does pretty much what you would make that match statement
看 一 下 Error Handling 章 节 的 这 部 分 :
do for you ! Take a look at this section of the Error Handling chapter :
https : / / doc . rust-lang . org / book / ch09-02-recoverable-errors-with-result . html #a-shortcut-for-propagating-errors-the--operator
https : / / doc . rust-lang . org / book / ch09-02-recoverable-errors-with-result . html #a-shortcut-for-propagating-errors-the--operator
and give it a try ! "" "
然 后 试 一 试 ! "" "
[ [ exercises ] ]
[ [ exercises ] ]
name = "errors3"
name = "errors3"
path = "exercises/error_handling/errors3.rs"
path = "exercises/error_handling/errors3.rs"
mode = "compile"
mode = "compile"
hint = "" "
hint = "" "
If other functions can return a ` Result ` , why shouldn ' t ` main ` ? "" "
如 果 其 它 函 数 可 以 返 回 ` Result ` , 为 什 么 ` main ` 函 数 不 能 ? "" "
[ [ exercises ] ]
[ [ exercises ] ]
name = "errors4"
name = "errors4"
path = "exercises/error_handling/errors4.rs"
path = "exercises/error_handling/errors4.rs"
mode = "test"
mode = "test"
hint = "" "
hint = "" "
` PositiveNonzeroInteger : : new ` is always creating a new instance and returning an ` Ok ` result .
` PositiveNonzeroInteger : : new ` 将 创 建 一 个 新 的 实 例 , 并 返 回 一 个 ` Ok ` 。
It should be doing some checking , returning an ` Err ` result if those checks fail , and only
它 应 该 做 一 些 检 查 , 如 果 检 查 到 失 败 , 则 返 回 ` Err ` , 如 果 确 定 一 切 正 常 , 则 返 回 ` Ok ` : ) 。 "" "
returning an ` Ok ` result if those checks determine that everything is . . . okay : ) "" "
[ [ exercises ] ]
[ [ exercises ] ]
name = "errors5"
name = "errors5"
path = "exercises/error_handling/errors5.rs"
path = "exercises/error_handling/errors5.rs"
mode = "compile"
mode = "compile"
hint = "" "
hint = "" "
Hint : There are two different possible ` Result ` types produced within
提 示 : 在 ` main ( ) ` 中 产 生 了 两 种 ` Result ` 类 型 , 它 们 是 通 过 ` ? ` 运 算 符 返 回 的 。
` main ( ) ` , which are propagated using ` ? ` operators . How do we declare a
那 么 我 们 如 何 在 ` main ( ) ` 中 声 明 一 个 容 纳 这 两 者 的 返 回 类 型 ?
return type from ` main ( ) ` that allows both ?
Another hint : under the hood , the ` ? ` operator calls ` From : : from `
额 外 提 示 : ` ? ` 操 作 符 的 底 层 实 现 实 际 上 是 对 错 误 值 调 用 了 ` From : : from ` , 将 其 转 换 为
on the error value to convert it to a boxed trait object , a
了 ` Box < dyn error : : Error > ` 类 型 。 它 是 多 态 的 — — 这 意 味 着 不 同 类 型 的 错 误 可 以 从 同 一 个 函 数 返 回 ,
` Box < dyn error : : Error > ` , which is polymorphic-- that means that lots of
因 为 它 们 都 实 现 了 ` error : : Error ` 特 征 , 行 为 都 是 一 致 的 。
different kinds of errors can be returned from the same function because
请 看 这 本 书 的 这 一 部 分 :
all errors act the same since they all implement the ` error : : Error ` trait .
Check out this section of the book :
https : / / doc . rust-lang . org / book / ch09-02-recoverable-errors-with-result . html #a-shortcut-for-propagating-errors-the--operator
https : / / doc . rust-lang . org / book / ch09-02-recoverable-errors-with-result . html #a-shortcut-for-propagating-errors-the--operator
This exercise uses some concepts that we won ' t get to until later in the
这 个 练 习 使 用 了 一 些 课 程 后 期 才 会 介 绍 到 的 概 念 , 如 ` Box ` 指 针 和 ` From ` 特 征 。
course , like ` Box ` and the ` From ` trait . It ' s not important to understand
现 在 详 细 了 解 它 们 并 不 重 要 , 但 如 果 你 感 兴 趣 , 可 以 提 前 阅 读 。
them in detail right now , but you can read ahead if you like .
Read more about boxing errors :
阅 读 更 多 装 箱 错 误 ( boxing errors ) 的 内 容 :
https : / / doc . rust-lang . org / stable / rust-by-example / error / multiple_error_types / boxing_errors . html
https : / / doc . rust-lang . org / stable / rust-by-example / error / multiple_error_types / boxing_errors . html
Read more about using the ` ? ` operator with boxed errors :
阅 读 更 多 关 于 使 用 ` ? ` 操 作 符 和 装 箱 错 误 的 内 容 。
https : / / doc . rust-lang . org / stable / rust-by-example / error / multiple_error_types / reenter_question_mark . html
https : / / doc . rust-lang . org / stable / rust-by-example / error / multiple_error_types / reenter_question_mark . html
"" "
"" "
@ -509,19 +498,15 @@ name = "errors6"
path = "exercises/error_handling/errors6.rs"
path = "exercises/error_handling/errors6.rs"
mode = "test"
mode = "test"
hint = "" "
hint = "" "
This exercise uses a completed version of ` PositiveNonzeroInteger ` from
这 个 练 习 使 用 的 是 来 自 于 error 4 的 ` PositiveNonzeroInteger ` 完 整 版 本 。
errors4 .
Below the line that TODO asks you to change , there is an example of using
在 TODO 要 求 你 修 改 的 那 一 行 下 面 , 有 一 个 在 ` Result ` 上 使 用 ` map_err ( ) ` 方 法 将
the ` map_err ( ) ` method on a ` Result ` to transform one type of error into
一 种 类 型 的 错 误 转 换 为 另 一 种 类 型 的 例 子 。 尝 试 在 ` parse ( ) ` 的 ` Result ` 上 使 用 类 似 的 东 西 。
another . Try using something similar on the ` Result ` from ` parse ( ) ` . You
你 可 能 使 用 ` ? ` 操 作 符 在 函 数 中 提 前 返 回 , 或 者 使 用 ` match ` 表 达 式 , 以 及 等 等 其 它 方 法 。
might use the ` ? ` operator to return early from the function , or you might
use a ` match ` expression , or maybe there ' s another way !
You can create another function inside ` impl ParsePosNonzeroError ` to use
你 可 以 在 ` impl ParsePosNonzeroError ` 内 创 建 另 一 个 方 法 来 配 合 ` map_err ( ) ` 使 用 。
with ` map_err ( ) ` .
Read more about ` map_err ( ) ` in the ` std : : result ` documentation :
在 ` std : : result ` 文 档 了 解 更 多 关 于 ` map_err ( ) ` 的 信 息 :
https : / / doc . rust-lang . org / std / result / enum . Result . html #method.map_err"""
https : / / doc . rust-lang . org / std / result / enum . Result . html #method.map_err"""
# Generics
# Generics