Rust’s road from entry to abandonment!
ownership
transfer between variables
1 2 3 4
|
let s1 = String ::from( "hello" ); let s2 = s1; // move the value of s1 to s2 // ... so s2 is no longer valid here println! ( "{}, world!" , s1); // here s1 no longer owns "hello"
|
When s1 is assigned to s2, Rust thinks that s1 is no longer valid, so there is no need to drop anything after s1 goes out of scope, which is to transfer ownership from s1 to s2, and s1 is invalid as soon as it is assigned to s2.
Since Rust prohibits you from using invalid references, you will see the following error:
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
|
function transfer by value
1 2 3 4 5 6 7 8 9 10
|
fn main () { let s = String ::from( "hello" ); // s goes into scope takes_ownership(s); // the value of s is moved into the function... // ... so no longer valid here 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 goes into scope | - move occurs because `s` has type `String`, which does not implement the `Copy` trait 3 | takes_ownership(s); // The value of s is moved into the function... | - value moved here 4 | // ... so no longer valid here 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)
|
quote
Because of the default ownership transfer, a reference is needed when we only need a read-only variable and don’t want to transfer ownership.
Syntax: &s
1 2 3 4 5 6 7 8 9 10
|
fn main () { let s = String ::from( "hello" ); // s goes into scope takes_ownership(&s); // &s means read-only in takes_ownership and will not modify its value // so this is no longer valid println! ( "{}" , s); }
fn takes_ownership (x: & String ) { println! ( "{}" , x); }
|
mutable reference
The referenced scope s starts at creation and lasts until it was last used
The scope of the variable lasts from creation to a certain curly brace }
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); // In the new compiler, the r1, r2 scope ends here
let r3 = &mut s; println!("{}", r3); } // In the new compiler, the r3 scope ends here
|
This article is reprinted from: https://lvdawei.com/post/rust-note/
This site is for inclusion only, and the copyright belongs to the original author.