Rust 关于锈菌的所有权

Rust 关于锈菌的所有权,rust,ownership,Rust,Ownership,我有一个关于铁锈所有权的问题 我没有使用过Rust,但我知道Rust有一个所有权概念,Rust通过所有权管理内存。 我了解到,生锈会阻止在编译时访问无效内存 如果有如下代码 let s1 = String::from("hello"); let s2 = s1; println!("{}, world!", s1); 它可能显示错误,因为s1是无效内存 在这里,我想知道下面这个例子的结果 let s1 = String::from("hell

我有一个关于铁锈所有权的问题

我没有使用过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条件可能是rand或用户输入等

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

但如果不执行if语句,则访问s1是有效的。 在这种情况下,锈是如何起作用的


谢谢阅读。

这种情况影响不大。由于IF可以移动S1,编译器必须考虑它为余下的范围移动。

关于:

错误[E0382]:移动值的借用:`s1` ->src/lib.rs:10:28 | 5 |设s1=String::fromhello; |-发生移动是因为's1'的类型为'std::string::string',而该类型未实现'Copy'特性 6 |如果std::env::args.next==无{ 7 |设_s2=s1; |-价值转移到这里 ... 10 | println{},world!,s1; |^^移动后在此借用的价值
如果您需要一个可能已从中移动的值,请使用。

@jjw如果您感兴趣,Rust将允许您在If块后使用moved from变量,如果您将其替换为以下内容:
fn main() {
    let s1 = String::from("hello");
    if std::env::args().next() == None { // runtime check
       let _s2 = s1;
    }
    
    println!("{}, world!", s1);
}