微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

关于Rust的所有权

如何解决关于Rust的所有权

我对Rust的所有权有疑问。

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

如果有以下代码

& 7zip x $zipFile "-o$output" "-p$zipFilePassword"

由于s1是无效的内存,它可能会显示错误

我想知道以下情况的结果。

let s1 = String::from("hello");
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!("{},s1);
   |                            ^^ value borrowed here after move

如果遇到需要从中转移值的情况,请使用Option

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。