gpt4 book ai didi

rust - 如何在 if-let 语句中将复制的变量引入为可变变量?

转载 作者:行者123 更新时间:2023-11-29 08:06:18 24 4
gpt4 key购买 nike

我有一个 HashMap<i8, i8>其中可能包含循环:

let mut x: HashMap<i8, i8> = HashMap::new();
x.insert(1, 6);
x.insert(3, 5);
x.insert(5, 1);

获取 3 的最终值, 它应该首先查找 x[3] , 然后 x[5]最后 x[1]应该产生 6 .我决定使用 while let循环:

let mut y = x[&3]; // y: i8
while let Some(&z) = x.get(&y) {
y = z;
}

println!("{}", y);

x.insert(0, 0);

这工作正常,但会 panic!如果3不在 map 上。因为我不想对 None 做任何事情情况下,我想使用 if let (类似于使用的 while let)。

我尝试了一些符号:

  1. if let Some(&y) = x.get(&3) : 复制值,但 y 是不可变的 ( y: i8 )
  2. if let Some(mut y) = x.get(&3) : y 是可变的,但值是借用的 ( mut y: &i8 )
  3. if let mut Some(&y) = x.get(&3) : 我的目标:可变副本,但语法无效 ( mut y: i8 )

(所有变体都在 Rust Playground 可用,但您需要注释掉第三次尝试,因为它是无效语法)

我不会争论第二个变体,但我需要在 if let 的正文中将值插入到我的映射中.由于 map 仍然是借来的,我不能再插入了。我只需要 Some(y) 中的值被复制,并且y是可变的,以便借用检查器得到满足,我可以进行递归查找。

最佳答案

您的方法 #1 是完全正确的匹配,您只需要使 y变量可变。一种可能性是转换 Option<&i8>Option<i8> , 启用 mut y 的使用在模式中。例如,Option::map可以取消引用该值:

if let Some(mut y) = x.get(&3).map(|ref| *ref) {

Copy暗示(便宜)Clone , 你可以用 Option::cloned() 表达同样的意思:

if let Some(mut y) = x.get(&3).cloned() {

从 Rust 1.35 开始,您可以使用 Option::copied() , 仅为 Copy 定义键入并仅复制值:

if let Some(mut y) = x.get(&3).copied() {

另一种可能性是按原样保留您的方法 #1,但只需在 if let 中引入一个单独的可变变量即可更正它。 block :

if let Some(&y) = x.get(&3) {
let mut y = y;
...

关于rust - 如何在 if-let 语句中将复制的变量引入为可变变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42052065/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com