start going through ch4
This commit is contained in:
parent
b26415019c
commit
1b1274ff90
7
ch4/ownership/Cargo.lock
generated
Normal file
7
ch4/ownership/Cargo.lock
generated
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
# This file is automatically @generated by Cargo.
|
||||||
|
# It is not intended for manual editing.
|
||||||
|
version = 3
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "ownership"
|
||||||
|
version = "0.1.0"
|
6
ch4/ownership/Cargo.toml
Normal file
6
ch4/ownership/Cargo.toml
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
[package]
|
||||||
|
name = "ownership"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
[dependencies]
|
69
ch4/ownership/src/main.rs
Normal file
69
ch4/ownership/src/main.rs
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
fn read(y: bool) {
|
||||||
|
if y {
|
||||||
|
println!("y is true!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Rust wants to ensure no undefined behavior at compile-time
|
||||||
|
// Sounds a lot like Haskell!
|
||||||
|
fn main() {
|
||||||
|
// read(x); // Moving read here would cause an error
|
||||||
|
let x = true;
|
||||||
|
read(x);
|
||||||
|
|
||||||
|
// -------------------------------------------------------------
|
||||||
|
// How variable live in the stack
|
||||||
|
|
||||||
|
let n = 5; // step 1: stack stores n = 5
|
||||||
|
let y = plus_one(n); // step 3: stack stores n = 5 and y = 6 now
|
||||||
|
println!("The value of y is: {y}");
|
||||||
|
|
||||||
|
// These variables live in frames
|
||||||
|
// The frame for main at step 1 holds n = 5
|
||||||
|
// Frame for plus_one at step 2 holds x = 5
|
||||||
|
// Frame for main at step 3 holds n = 5 and y = 6
|
||||||
|
//
|
||||||
|
// These frames get organized into a stack of currently-called-functions.
|
||||||
|
// At step 2, the frame for main sits above the frame for the called function, plus_one.
|
||||||
|
//
|
||||||
|
// For Rust to transfer access to data without copying it, it uses pointers.
|
||||||
|
// Pointers and pointees
|
||||||
|
// Rust can put data on the heap with Box.
|
||||||
|
// The stack holds data associated with specific functions while
|
||||||
|
// the heap holds data that can outlive a function.
|
||||||
|
|
||||||
|
// There is only one array in memory at a time with this method.
|
||||||
|
let a = Box::new([0; 1_000_000]);
|
||||||
|
let b = a;
|
||||||
|
// println!("first value of a {}", a[0]); // This code is invalid bc of borrowing from a
|
||||||
|
|
||||||
|
// Rust doesn't allow user memory management
|
||||||
|
|
||||||
|
// -------------------------------------------------------------
|
||||||
|
// Box's owner manages deallocation
|
||||||
|
|
||||||
|
// Almost how this works:
|
||||||
|
// When a variable is bound to a box, when Rust deallocates the variable's
|
||||||
|
// frame, then Rust deallocates the box's heap memory.
|
||||||
|
let a_num = 4;
|
||||||
|
make_and_drop();
|
||||||
|
|
||||||
|
// How this works fully (uses ownership):
|
||||||
|
// When variable owns a box, when Rust deallocates the variable's frame,
|
||||||
|
// then Rust deallocates the box's heap memory.
|
||||||
|
let d = Box::new([0; 1_000_000]); // d owns this Box here
|
||||||
|
let e = d; // e has ownership of the box transfered to it from d
|
||||||
|
|
||||||
|
// Rust data structures like String, Vec, and HashMap use Boxes.
|
||||||
|
|
||||||
|
// Stopped here for the night:
|
||||||
|
// https://rust-book.cs.brown.edu/ch04-01-what-is-ownership.html#variables-cannot-be-used-after-being-moved
|
||||||
|
}
|
||||||
|
|
||||||
|
fn plus_one(x: i32) -> i32 {
|
||||||
|
x + 1 // step 2: stack stores n = 5 from main and x = 5 in this function
|
||||||
|
}
|
||||||
|
|
||||||
|
fn make_and_drop() {
|
||||||
|
let a_box = Box::new(5);
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user