gpt4 book ai didi

rust - Rust 中的模式匹配如何使用 `let` 语句

转载 作者:行者123 更新时间:2023-12-03 11:26:44 25 4
gpt4 key购买 nike

为什么片段 pattern_matching_2pattern_matching_3 有效而 pattern_matching_1 无效?编译器建议 let &x = &foo 移动字符串 hello,我知道但看不到问题出在哪里——我没有使用 foo无论如何,编译器不会提示 pattern_matching_3,它也会移动字符串 hello。

示例片段改编自 this answer ,它没有回答我的问题。

代码片段:

fn pattern_matching_1() {
let foo = String::from("hello");
let &x = &foo;
println!("{}", x);
}

fn pattern_matching_2() {
let foo = 12;
let &x = &foo;
println!("{}", x);
}

fn pattern_matching_3() {
let foo = String::from("hello");
let x = foo;
println!("{}", x);
}

pattern_matching_1 的编译错误:

error[E0507]: cannot move out of a shared reference
--> src/main.rs:26:14
|
26 | let &x = &foo;
| -- ^^^^
| ||
| |data moved here
| |move occurs because `x` has type `String`, which does not implement the `Copy` trait
| help: consider removing the `&`: `x`

最佳答案

he compiler suggests that let &x = &foo moves the string hello, which I'm aware of and don't see where the problem is

问题是您为编译器提供了对变量的不可变引用 (&foo),然后要求它移走基础数据。这不是不可变引用所允许的操作。

为了使这一点更明确,将移出部分提取到另一个函数中:

fn pattern_matching_1_helper(r: &String) {
let &x = r;
println!("{}", x);
}

fn pattern_matching_1() {
let foo = String::from("hello");
pattern_matching_1_helper(&foo);
}

我希望 pattern_matching_1_helper 不能自行编译是显而易见的。但是您代码中的组合版本确实没有什么不同。

pattern_matching_2编译因为i32Copy,所以编译器不需要动。

关于rust - Rust 中的模式匹配如何使用 `let` 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66419483/

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