关于 Rust 的所有权

About ownership of Rust

我对 Rust 的所有权有疑问。

我没有用过 Rust,但我知道 Rust 有一个所有权概念,Rust 通过所有权来管理内存。 我了解到 Rust 会阻止在编译时访问无效内存。

如果有如下代码

let s1 = String::from("hello");
let s2 = s1;

println!("{}, world!", s1);

可能会显示错误,因为s1是无效内存

在这里我想知道下面情况的结果。

let s1 = String::from("hello");
if(The condition that can't know in compile time)
   let s2 = s1;

println!("{}, world!", s1);

if 条件可以是随机数或用户输入等

if执行if语句s1会移动到s2,if语句结束时删除。 在这种情况下,访问 println 上的 s1 将产生错误。

但是如果不执行if语句,访问s1是有效的。 Rust 在这种情况下如何运作?

感谢阅读。

病情影响不大。由于 if 可能 移动 s1,编译器必须考虑将其移动到范围的其余部分。

playground:

fn main() {
    let s1 = String::from("hello");
    if std::env::args().next() == None { // runtime check
       let _s2 = s1;
    }
    
    println!("{}, world!", s1);
}
error[E0382]: borrow of moved value: `s1`
  --> src/lib.rs:10:28
   |
5  |     let s1 = String::from("hello");
   |         -- move occurs because `s1` has type `std::string::String`, which does not implement the `Copy` trait
6  |     if std::env::args().next() == None {
7  |        let _s2 = s1;
   |                  -- value moved here
...
10 |     println!("{}, world!", s1);
   |                            ^^ value borrowed here after move

如果您需要一个可能已被移动的值,请使用 Option