diff --git a/courses/comprehensive_rust_training/080_pattern_matching/05_exercise.rst b/courses/comprehensive_rust_training/080_pattern_matching/05_exercise.rst index 536f6be95..82759b289 100644 --- a/courses/comprehensive_rust_training/080_pattern_matching/05_exercise.rst +++ b/courses/comprehensive_rust_training/080_pattern_matching/05_exercise.rst @@ -11,37 +11,14 @@ Let's write a simple recursive evaluator for arithmetic expressions. An example of a small arithmetic expression could be :rust:`10 + 20`, which evaluates to :rust:`30`. We can represent the expression as a tree: -.. code:: bob - - .-------. - .------ | + | ------. - | '-------' | - v v - .--------. .--------. - | 10 | | 20 | - '--------' '--------' +.. image:: comprehensive_rust_training/pattern_matching_exercise_1.svg + :width: 40% A bigger and more complex expression would be :rust:`(10 * 9) + ((3 - 4) * 5)`, which evaluate to :rust:`85`. We represent this as a much bigger tree: -.. code:: bob - - .-----. - .---------------- | + | ----------------. - | '-----' | - v v - .-----. .-----. - .---- | * | ----. .---- | * | ----. - | '-----' | | '-----' | - v v v v - .------. .-----. .-----. .-----. - | 10 | | 9 | .---- | "-"| ----. | 5 | - '------' '-----' | '-----' | '-----' - v v - .-----. .-----. - | 3 | | 4 | - '-----' '-----' +.. image:: comprehensive_rust_training/pattern_matching_exercise_2.svg In code, we will represent the tree with two types: diff --git a/courses/comprehensive_rust_training/130_memory_management/01_review.rst b/courses/comprehensive_rust_training/130_memory_management/01_review.rst index a50686cf0..d41ecefad 100644 --- a/courses/comprehensive_rust_training/130_memory_management/01_review.rst +++ b/courses/comprehensive_rust_training/130_memory_management/01_review.rst @@ -34,19 +34,7 @@ dynamically sized data, the actual string, on the heap: let s1 = String::from("Hello"); } -.. code:: bob - - Stack - .- - - - - - - - - - - - - -. Heap - : : .- - - - - - - - - - - - - - - -. - : s1 : : : - : +-----------+-------+ : : : - : | capacity | 5 | : : +----+----+----+----+----+ : - : | ptr | o-+---+-----+-->| H | e | l | l | o | : - : | len | 5 | : : +----+----+----+----+----+ : - : +-----------+-------+ : : : - : : : : - `- - - - - - - - - - - - - -' `- - - - - - - - - - - - - - - -' +.. image:: comprehensive_rust_training/review_of_program_memory.svg --------- Details diff --git a/courses/comprehensive_rust_training/130_memory_management/04_move.rst b/courses/comprehensive_rust_training/130_memory_management/04_move.rst index 1083b3ca2..971b027a7 100644 --- a/courses/comprehensive_rust_training/130_memory_management/04_move.rst +++ b/courses/comprehensive_rust_training/130_memory_management/04_move.rst @@ -11,7 +11,7 @@ An assignment will transfer *ownership* between variables: .. code:: rust fn main() { - let s1: String = String::from("Hello!"); + let s1: String = String::from("Hello"); let s2: String = s1; println!("s2: {s2}"); // println!("s1: {s1}"); @@ -24,43 +24,11 @@ An assignment will transfer *ownership* between variables: Before move to :rust:`s2`: -.. code:: bob - - Stack Heap - .- - - - - - - - - - - - - -. .- - - - - - - - - - - - - - - - - - -. - : : : : - : s1 : : : - : +-----------+-------+ : : +----+----+----+----+----+----+ : - : | ptr | o---+---+-----+-->| H | e | l | l | o | ! | : - : | len | 6 | : : +----+----+----+----+----+----+ : - : | capacity | 6 | : : : - : +-----------+-------+ : : : - : : `- - - - - - - - - - - - - - - - - - -' - : : - `- - - - - - - - - - - - - -' +.. image:: comprehensive_rust_training/review_of_program_memory.svg After move to :rust:`s2`: -.. code:: bob - - Stack Heap - .- - - - - - - - - - - - - -. .- - - - - - - - - - - - - - - - - - -. - : : : : - : s1 "(inaccessible)" : : : - : +-----------+-------+ : : +----+----+----+----+----+----+ : - : | ptr | o---+---+--+--+-->| H | e | l | l | o | ! | : - : | len | 6 | : | : +----+----+----+----+----+----+ : - : | capacity | 6 | : | : : - : +-----------+-------+ : | : : - : : | `- - - - - - - - - - - - - - - - - - -' - : s2 : | - : +-----------+-------+ : | - : | ptr | o---+---+--' - : | len | 6 | : - : | capacity | 6 | : - : +-----------+-------+ : - : : - `- - - - - - - - - - - - - -' +.. image:: comprehensive_rust_training/move_semantics_2.svg When you pass a value to a function, the value is assigned to the function parameter. This transfers ownership: @@ -109,6 +77,10 @@ In the :rust:`say_hello` example: making move semantics the default, and by forcing programmers to make clones explicit. +================= +More to Explore +================= + -------------------------------- Defensive Copies in Modern C++ -------------------------------- @@ -117,7 +89,7 @@ Modern C++ solves this differently: .. code:: cpp - std::string s1 = "Cpp"; + std::string s1 = "Hello"; std::string s2 = s1; // Duplicate the data in s1. - The heap data from :rust:`s1` is duplicated and :rust:`s2` gets its own @@ -127,42 +99,11 @@ Modern C++ solves this differently: Before copy-assignment: -.. code:: bob - - Stack Heap - .- - - - - - - - - - - - - -. .- - - - - - - - - - - -. - : : : : - : s1 : : : - : +-----------+-------+ : : +----+----+----+ : - : | ptr | o---+---+--+--+-->| C | p | p | : - : | len | 3 | : : +----+----+----+ : - : | capacity | 3 | : : : - : +-----------+-------+ : : : - : : `- - - - - - - - - - - -' - `- - - - - - - - - - - - - -' +.. image:: comprehensive_rust_training/review_of_program_memory.svg After copy-assignment: -.. code:: bob - - Stack Heap - .- - - - - - - - - - - - - -. .- - - - - - - - - - - -. - : : : : - : s1 : : : - : +-----------+-------+ : : +----+----+----+ : - : | ptr | o---+---+--+--+-->| C | p | p | : - : | len | 3 | : : +----+----+----+ : - : | capacity | 3 | : : : - : +-----------+-------+ : : : - : : : : - : s2 : : : - : +-----------+-------+ : : +----+----+----+ : - : | ptr | o---+---+-----+-->| C | p | p | : - : | len | 3 | : : +----+----+----+ : - : | capacity | 3 | : : : - : +-----------+-------+ : : : - : : `- - - - - - - - - - - -' - `- - - - - - - - - - - - - -' +.. image:: comprehensive_rust_training/copy_assignment_2.svg Key points: diff --git a/courses/comprehensive_rust_training/140_smart_pointers/01_box.rst b/courses/comprehensive_rust_training/140_smart_pointers/01_box.rst index 470a8470a..96b8e3503 100644 --- a/courses/comprehensive_rust_training/140_smart_pointers/01_box.rst +++ b/courses/comprehensive_rust_training/140_smart_pointers/01_box.rst @@ -16,18 +16,8 @@ owned pointer to data on the heap: println!("five: {}", *five); } -.. code:: bob - - Stack Heap - .- - - - - - -. .- - - - - - -. - : : : : - : five : : : - : +-----+ : : +-----+ : - : | o---|---+-----+-->| 5 | : - : +-----+ : : +-----+ : - : : : : - : : : : - `- - - - - - -' `- - - - - - -' +.. image:: comprehensive_rust_training/smart_pointers_box_1.svg + :width: 50% :rust:`Box` implements :rust:`Deref`, which means that you can :url:`call methods from T directly on a Box `. @@ -52,18 +42,7 @@ indirection: println!("{list:?}"); } -.. code:: bob - - Stack Heap - .- - - - - - - - - - - - - - . .- - - - - - - - - - - - - - - - - - - - - - - - -. - : : : : - : list : : : - : +---------+----+----+ : : +---------+----+----+ +------+----+----+ : - : | Element | 1 | o--+----+-----+--->| Element | 2 | o--+--->| Nil | // | // | : - : +---------+----+----+ : : +---------+----+----+ +------+----+----+ : - : : : : - : : : : - '- - - - - - - - - - - - - - ' '- - - - - - - - - - - - - - - - - - - - - - - - -' +.. image:: comprehensive_rust_training/smart_pointers_box_2.svg --------- Details diff --git a/courses/comprehensive_rust_training/140_smart_pointers/03_trait_objects.rst b/courses/comprehensive_rust_training/140_smart_pointers/03_trait_objects.rst index a0ba50829..5af485a78 100644 --- a/courses/comprehensive_rust_training/140_smart_pointers/03_trait_objects.rst +++ b/courses/comprehensive_rust_training/140_smart_pointers/03_trait_objects.rst @@ -48,37 +48,7 @@ like :rust:`Box` to create an owned trait object: :rust:`Box`. Memory layout after allocating :rust:`pets`: -.. code:: bob - - Stack Heap - .- - - - - - - - - - - - - - - -. .- - - - - - - - - - - - - - - - - - - - - - -. - : : : : - : "pets: Vec>" : : "data: Cat" +----+----+----+----+ : - : +-----------+-------+ : : +-------+-------+ | F | i | d | o | : - : | ptr | o---+-------+--. : | lives | 9 | +----+----+----+----+ : - : | len | 2 | : | : +-------+-------+ ^ : - : | capacity | 2 | : | : ^ | : - : +-----------+-------+ : | : | '-------. : - : : | : | data:"Dog"| : - : : | : | +-------+--|-------+ : - `- - - - - - - - - - - - - - - -' | : +---|-+-----+ | name | o, 4, 4 | : - `--+-->| o o | o o-|----->| age | 5 | : - : +-|---+-|---+ +-------+----------+ : - : | | : - `- - -| - - |- - - - - - - - - - - - - - - - -' - | | - | | "Program text" - .- - -| - - |- - - - - - - - - - - - - - - - -. - : | | vtable : - : | | +----------------------+ : - : | `----->| "::talk" | : - : | +----------------------+ : - : | vtable : - : | +----------------------+ : - : '----------->| "::talk" | : - : +----------------------+ : - : : - '- - - - - - - - - - - - - - - - - - - - - - -' +.. image:: comprehensive_rust_training/smart_pointers_owned_objects.svg --------- Details diff --git a/images/comprehensive_rust_training/copy_assignment_2.svg b/images/comprehensive_rust_training/copy_assignment_2.svg new file mode 100644 index 000000000..1e580a7dc --- /dev/null +++ b/images/comprehensive_rust_training/copy_assignment_2.svg @@ -0,0 +1,554 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Stack + + Heap + + capacity +ptr +len + 5 + +5 + + + + s1 + + capacity +ptr +len + 5 + +5 + + + + s2 + + + H e l l o + + + + + + + + + + + + + + + + + + + + + + H e l l o + + diff --git a/images/comprehensive_rust_training/move_semantics_2.svg b/images/comprehensive_rust_training/move_semantics_2.svg new file mode 100644 index 000000000..49c8725d7 --- /dev/null +++ b/images/comprehensive_rust_training/move_semantics_2.svg @@ -0,0 +1,486 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Stack + + Heap + + capacity +ptr +len + 5 + +5 + + + + s1 (inaccessible) + + + capacity +ptr +len + 5 + +5 + + + + s2 + + + + H e l l o + + + + + + + + + + + + diff --git a/images/comprehensive_rust_training/pattern_matching_exercise_1.svg b/images/comprehensive_rust_training/pattern_matching_exercise_1.svg new file mode 100644 index 000000000..a5bf7edf0 --- /dev/null +++ b/images/comprehensive_rust_training/pattern_matching_exercise_1.svg @@ -0,0 +1,150 @@ + + + + + + + + + + + + 20 + + 10 + + + + + + + + diff --git a/images/comprehensive_rust_training/pattern_matching_exercise_2.svg b/images/comprehensive_rust_training/pattern_matching_exercise_2.svg new file mode 100644 index 000000000..536c6051a --- /dev/null +++ b/images/comprehensive_rust_training/pattern_matching_exercise_2.svg @@ -0,0 +1,414 @@ + + + + + + + + + * + + 9 + + 10 + + + + + + + + + - + + 4 + + 3 + + + + * + + 5 + + + + + + + + + + + + + + + + + + + + diff --git a/images/comprehensive_rust_training/review_of_program_memory.svg b/images/comprehensive_rust_training/review_of_program_memory.svg new file mode 100644 index 000000000..5e4569839 --- /dev/null +++ b/images/comprehensive_rust_training/review_of_program_memory.svg @@ -0,0 +1,381 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Stack + + Heap + + capacity +ptr +len + 5 + +5 + + + + s1 + + + H e l l o + + + + + + + + + + + + diff --git a/images/comprehensive_rust_training/smart_pointers_box_1.svg b/images/comprehensive_rust_training/smart_pointers_box_1.svg new file mode 100644 index 000000000..23eec795c --- /dev/null +++ b/images/comprehensive_rust_training/smart_pointers_box_1.svg @@ -0,0 +1,302 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Stack + + Heap + + five + + + 5 + + + diff --git a/images/comprehensive_rust_training/smart_pointers_box_2.svg b/images/comprehensive_rust_training/smart_pointers_box_2.svg new file mode 100644 index 000000000..785df6428 --- /dev/null +++ b/images/comprehensive_rust_training/smart_pointers_box_2.svg @@ -0,0 +1,489 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Stack + + Heap + list + + + Element + 1 + + + + + Element + 2 + + + + Nil + // + + + + // + + + diff --git a/images/comprehensive_rust_training/smart_pointers_owned_objects.svg b/images/comprehensive_rust_training/smart_pointers_owned_objects.svg new file mode 100644 index 000000000..65190bc29 --- /dev/null +++ b/images/comprehensive_rust_training/smart_pointers_owned_objects.svg @@ -0,0 +1,782 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Stack + + Heap + + capacity +ptr +len + 2 + +2 + + + + pets: Vec<Box<dyn Pet>> + + Program text + + F i d o + + + + + + + + + + + lives + + + + 9 + data: Cat + + + name +age + , 4, 4 +5 + data: Dog + + + + <Dog as Pet>::talk + vtable + + <Cat as Pet>::talk + vtable + + + + + + +