gpt4 book ai didi

rust - Rust 中只有一个变量名和一个分号的语句是什么意思?

转载 作者:行者123 更新时间:2023-12-05 01:12:20 29 4
gpt4 key购买 nike

我在玩 Rust,发现了下面的例子:

fn main() {
let mut x = [3, 4, 5].to_vec();
x;
println!("{:?}", x);
}

编译器告诉我

18 |     let mut x = [3, 4, 5].to_vec();
| ----- move occurs because `x` has type `std::vec::Vec<i32>`, which does not implement the `Copy` trait
...
21 | x;
| - value moved here
22 | println!("{:?}", x);
| ^ value borrowed here after move

似乎语句 x; 导致 x move 到某个地方,之后就不能使用了。搬家目的地在哪里,这里到底发生了什么?

我四处搜索,找不到任何解释这一点的信息。也许我使用了错误的关键字。

顺便说一句,我正在使用这个版本的 Rust:rustc 1.41.0-nightly (99b89533d 2019-12-16)

最佳答案

x;an expression statement那:

An expression statement is one that evaluates an expression and ignores its result.

这里的表达式依次为a place expression其中:

Moving out of a place expression that evaluates to a local variable, the location is deinitialized and cannot be read from again until it is reinitialized.

所以之后你就不能再使用它了。事实上,如果您编译以下内容:

fn main() {
let x = vec![42];
x;
}

至和平号:

fn  main() -> () {
let mut _0: (); // return place in scope 0 at src/main.rs:1:11: 1:11
let _1: std::vec::Vec<i32>; // "x" in scope 0 at src/main.rs:2:9: 2:10

...

bb1: {
StorageDead(_2); // bb1[0]: scope 0 at <::alloc::macros::vec macros>:2:62: 2:63
StorageLive(_5); // bb1[1]: scope 1 at src/main.rs:3:5: 3:6
_5 = move _1; // bb1[2]: scope 1 at src/main.rs:3:5: 3:6
drop(_5) -> bb2; // bb1[3]: scope 1 at src/main.rs:3:6: 3:7
}
}

您可以清楚地看到它被 move 到一个临时变量中,并且该临时变量立即被删除。

关于rust - Rust 中只有一个变量名和一个分号的语句是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59439201/

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