Rust 从入门到放弃之路!
所有权
变量间转移
1 2 3 4
|
let s1 = String::from("hello"); let s2 = s1;// s1 的值移动到 s2 // ... 所以 s2 到这里不再有效 println!("{}, world!", s1); // 此处s1已经没有"hello"的所有权
|
当 s1 赋予 s2 后,Rust 认为 s1 不再有效,因此也无需在 s1 离开作用域后 drop 任何东西,这就是把所有权从 s1 转移给了 s2,s1 在被赋予 s2 后就马上失效了。
由于 Rust 禁止你使用无效的引用,你会看到以下的错误:
1 2 3 4 5 6 7 8 9 10 11
|
error[E0382]: use of moved value: `s1` --> src/main.rs:5:28 | 3 | let s2 = s1; | -- value moved here 4 | 5 | println!("{}, world!", s1); | ^^ value used here after move | = note: move occurs because `s1` has type `std::string::String`, which does not implement the `Copy` trait
|
函数传值转移
1 2 3 4 5 6 7 8 9 10
|
fn main() { let s = String::from("hello"); // s 进入作用域 takes_ownership(s); // s 的值移动到函数里 ... // ... 所以到这里不再有效 println!("{}", s); }
fn takes_ownership(x: String) { println!("{}", x); }
|
1 2 3 4 5 6 7 8 9 10
|
| 2 | let s = String::from("hello"); // s 进入作用域 | - move occurs because `s` has type `String`, which does not implement the `Copy` trait 3 | takes_ownership(s); // s 的值移动到函数里 ... | - value moved here 4 | // ... 所以到这里不再有效 5 | println!("{}", s); | ^ value borrowed here after move | = note: this error originates in the macro `$crate::format_args_nl` (in Nightly builds, run with -Z macro-backtrace for more info)
|
引用
由于默认的所有权转移存在,当我们仅需要只读变量,并不想将所有权转移时,就需要引用。
语法:&s
1 2 3 4 5 6 7 8 9 10
|
fn main() { let s = String::from("hello"); // s 进入作用域 takes_ownership(&s); // &s表示在takes_ownership中只读,并不会修改他的值 // 所以到这里不再有效 println!("{}", s); }
fn takes_ownership(x: &String) { println!("{}", x); }
|
可变引用
引用的作用域 s 从创建开始,一直持续到它最后一次使用的地方
变量的作用域从创建持续到某一个花括号 }
1 2 3 4 5 6 7 8 9 10 11
|
fn main() { let mut s = String::from("hello");
let r1 = &s; let r2 = &s; println!("{} and {}", r1, r2); // 新编译器中,r1,r2作用域在这里结束
let r3 = &mut s; println!("{}", r3); } // 新编译器中,r3作用域在这里结束
|
本文转自: https://lvdawei.com/post/rust-note/
本站仅做收录,版权归原作者所有。
Post Views: 97