by Jan Van Sweevelt
fn main() {
println!("Hello, {}", "world!");
}
Variables are moved to new locations, preventing the previous location from using it
There is only one owner of the data !!!
int main() {
int *slot = malloc(sizeof(int));
*slot = 3;
helper(slot);
helper(slot);
}
void helper(int *slot) {
printf("The number was: %d\n", *slot);
free(slot);
}
❯ ./a.out
The number was: 3
The number was: 1595491008
free(): double free detected in tcache 2
Aborted (core dumped)
fn main() {
let slot = Box::new(3);
helper(slot); // moves the value !
helper(slot); // error: use of moved value
}
fn helper(slot: Box<i32>) {
println!("The number was: {}", slot);
}
Transfer of ownership
fn helper() -> Box<i32> {
let three = Box::new(3);
return three; // transfer ownership
}
fn main() {
// acquire ownership of return value
let my_three = helper();
}
struct A {b: B}
struct B {c: Box<i32>}
fn main() {
let a: A = A { b: B { c: Box::new(2) } };
let x = a.b.c;
let y: B = a.b; // error ! (moved by 'x')
}
// The '&' sigil means "borrowed reference"
fn helper(slot: &Vec<i32>) { /* ... */ }
fn main() {
let a = Vec::new();
// doesn't move !
helper(&a);
helper(&a);
}
let a: ∫
{
let b = 3;
a = &b;
} // error ! 'b' does not live long enough
let a: ∫
let b = 3;
a = &b; // ok, 'b' has the same lifetime as 'a'
let a = Vec::new();
let b = &a;
work_with(a); // error !
let a = Vec::new();
{
let b = &a;
}
work_with(a); // ok
fn main() {
println!("Your number was: {}", *helper());
}
fn helper() -> &i32 {
let a = 3;
return &a;
}
struct MyStruct { inner: i32 }
fn get(s: &MyStruct) -> &i32 {
&s.inner
}
fn main() {
let a = MyStruct { inner: 3 };
let inner = get(&a); // same lifetime as 'a'
}
fn clone_vector(v: &Vec<i32>) -> Vec<i32> {
v.clone()
}