关于 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
。
我对 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
。