@ -152,64 +152,57 @@ name = "move_semantics1"
path = "exercises/move_semantics/move_semantics1.rs"
path = "exercises/move_semantics/move_semantics1.rs"
mode = "compile"
mode = "compile"
hint = "" "
hint = "" "
So you ' ve got the "cannot borrow immutable local variable `vec1` as mutable" error on line 13 ,
在 第 13 行 有 个 "cannot borrow immutable local variable `vec1` as mutable" * 错 误 , 对 吗 ?
right ? The fix for this is going to be adding one keyword , and the addition is NOT on line 13
修 复 错 误 的 方 法 是 添 加 一 个 关 键 词 , 并 且 添 加 的 位 置 不 在 报 错 的 第 13 行 上 。
where the error is . "" "
译 注 : 不 能 将 不 可 变 的 局 部 变 量 ` vec1 ` 借 用 为 可 变 变 量 "" "
[ [ exercises ] ]
[ [ exercises ] ]
name = "move_semantics2"
name = "move_semantics2"
path = "exercises/move_semantics/move_semantics2.rs"
path = "exercises/move_semantics/move_semantics2.rs"
mode = "compile"
mode = "compile"
hint = "" "
hint = "" "
So ` vec0 ` is being * moved * into the function ` fill_vec ` when we call it on
当 我 们 在 第 10 行 调 用 ` fill_vec ` 时 , ` vec0 ' 被 * 移 动 ( moved ) * 到
line 10 , which means it gets dropped at the end of ` fill_vec ` , which means we
函 数 ` fill_vec ` 中 , 这 意 味 着 它 会 在 ` fill_vec ` 函 数 的 末 尾 被 丢 弃 , 同 时 也
can ' t use ` vec0 ` again on line 13 ( or anywhere else in ` main ` after the
导 致 了 我 们 不 能 在 第 13 行 再 次 使 用 ` vec0 ` ( 或 在 ` main ` 中 调 用 ` fill_vec ` 后 的 任 何 地 方 ) 。
` fill_vec ` call for that matter ) . We could fix this in a few ways , try them
我 们 可 以 用 几 种 方 法 来 解 决 这 个 问 题 , 都 试 一 试 吧 !
all !
1 . 做 一 个 ` vec0 ` 数 据 的 拷 贝 , 并 将 其 传 递 给 ` fill_vec ` 。
1 . Make another , separate version of the data that ' s in ` vec0 ` and pass that
2 . 让 ` fill_vec ` 通 过 借 用 而 不 是 获 取 所 有 权 的 方 式 获 取 参 数 , 然 后 在 函 数 中 复 制 一 份 数 据 , 以 便 返 回
to ` fill_vec ` instead .
一 个 具 有 所 有 权 的 ` Vec < i32 > ` 变 量 。
2 . Make ` fill_vec ` borrow its argument instead of taking ownership of it ,
3 . 让 ` fill_vec ` 借 用 可 变 参 数 ( 参 数 也 需 要 可 变 ) , 直 接 进 行 操 作 , 然 后 不 返 回 任 何 东 西 。 接 着 你 需 要
and then copy the data within the function in order to return an owned
完 全 地 去 掉 ` vec1 ` — — 但 注 意 , 这 也 将 改 变 第 一 个 ` println ! ` 打 印 出 内 容 。 "" "
` Vec < i32 > `
3 . Make ` fill_vec ` * mutably * borrow its argument ( which will need to be
mutable ) , modify it directly , then not return anything . Then you can get rid
of ` vec1 ` entirely -- note that this will change what gets printed by the
first ` println ! ` "" "
[ [ exercises ] ]
[ [ exercises ] ]
name = "move_semantics3"
name = "move_semantics3"
path = "exercises/move_semantics/move_semantics3.rs"
path = "exercises/move_semantics/move_semantics3.rs"
mode = "compile"
mode = "compile"
hint = "" "
hint = "" "
The difference between this one and the previous ones is that the first line
与 之 前 不 同 : ` fn fill_vec ` 第 一 行 的 ` let mut vec = vec ; ` 现 在 已 经 不 存 在 了 。
of ` fn fill_vec ` that had ` let mut vec = vec ; ` is no longer there . You can ,
你 可 以 在 某 个 地 方 添 加 ` mut ` 以 使 现 有 的 不 可 变 绑 定 变 得 可 变 , 而 非 把 不 同 的 那 一 行 加 回 去 : ) "" "
instead of adding that line back , add ` mut ` in one place that will change
an existing binding to be a mutable binding instead of an immutable one : ) "" "
[ [ exercises ] ]
[ [ exercises ] ]
name = "move_semantics4"
name = "move_semantics4"
path = "exercises/move_semantics/move_semantics4.rs"
path = "exercises/move_semantics/move_semantics4.rs"
mode = "compile"
mode = "compile"
hint = "" "
hint = "" "
Stop reading whenever you feel like you have enough direction : ) Or try
只 要 你 觉 得 有 确 切 的 目 标 , 就 可 以 停 止 阅 读 : ) 或 者 试 着 做 一 个 步 骤 , 然 后 修 复 编 译 错 误 。
doing one step and then fixing the compiler errors that result !
因 此 , 目 标 有 :
So the end goal is to :
- 去 掉 main 中 创 建 新 vector 的 第 一 行
- get rid of the first line in main that creates the new vector
- 所 以 ` vec0 ` 并 不 存 在 , 所 以 我 们 不 能 把 它 传 给 ` fill_vec ` 。
- so then ` vec0 ` doesn 't exist, so we can' t pass it to ` fill_vec `
- 我 们 不 需 要 向 ` fill_vec ` 传 递 任 何 东 西 , 所 以 它 的 签 名 应 该 反 映 出 它 不 接 受 任 何 参 数 * 。
- we don ' t want to pass anything to ` fill_vec ` , so its signature should
- 由 于 我 们 已 不 在 ` main ` 创 建 vector , 所 以 需 要 在 ` fill_vec ` 中 创 建 一 个 新 的 vector ,
reflect that it does not take any arguments
类 似 于 ` main ` 中 的 做 法 。
- since we ' re not creating a new vec in ` main ` anymore , we need to create
a new vec in ` fill_vec ` , similarly to the way we did in ` main ` "" "
译 注 : 练 习 中 fill_vec 的 函 数 签 名 已 经 没 有 接 受 参 数 了 , 所 以 估 计 是 在 调 用 的 地 方 "" "
[ [ exercises ] ]
[ [ exercises ] ]
name = "move_semantics5"
name = "move_semantics5"
path = "exercises/move_semantics/move_semantics5.rs"
path = "exercises/move_semantics/move_semantics5.rs"
mode = "compile"
mode = "compile"
hint = "" "
hint = "" "
Carefully reason about the range in which each mutable reference is in
仔 细 推 敲 每 个 可 变 引 用 的 使 用 范 围 。
vogue . Does it help to update the value of referent ( x ) immediately after
在 获 取 可 变 引 用 后 是 否 能 够 立 即 更 新 引 用 ( x ) 的 值 ?
the mutable reference is taken ? Read more about 'Mutable References'
在 本 书 的 'References and Borrowing' 部 分 了 解 更 多 关 于 'Mutable References' 的 信 息 。
in the book 's section References and Borrowing' :
https : / / doc . rust-lang . org / book / ch04-02-references-and-borrowing . html #mutable-references.
https : / / doc . rust-lang . org / book / ch04-02-references-and-borrowing . html #mutable-references.
"" "
"" "