mirror of
https://github.com/rust-lang/rustlings.git
synced 2026-01-11 13:19:18 +00:00
4.0 KiB
4.0 KiB
- primitive_types4.rs - slices and arrays
- Revisit macros (good explanation here: https://doc.rust-lang.org/rust-by-example/macros.html)
- vecs2.rs -> review v.iter_mut to mutate vector elements vs. let out = v.iter().map(|n| n*2).collect() to multiple each value but return results to new Vec vector
- move_semantics1 why does vec0 -> v inside the function allow v to be mutable? Analyze in detail. [Actually this is called a move of ownership!]
- move_semantics2 -> important!!!
- structs3 -> review impl (for struct implementations it adds StructName::method() methods to it (kind of like a value receiver in Go :) . Keep in mind there are also trait (interface) impls.
- enums2 and enums3 are VERY important to understand enum matching!!!
- strings3 check differences between str and String libraries. Yes str is a string slice but how to know when to use String methods?
- modules all -> important for understanding modules
- insert method for hashmaps (see hashmaps1)
- hashmap3 is good for understanding entry().or_insert() pattern for hashmaps
- generics2. review https://doc.rust-lang.org/book/ch10-01-syntax.html
- traits1 why is self accepted since it's being updated?
- revisit all traits exercises
- options1 (understand Some and None)
- option2 (important to understand if let, while let statements alternative to match ). ChatGPT explanation was great.
- errors2 make sure you understand error propagation but also the long-form solution (just for understanding). "The ? placed after a Result value is defined to work in almost the same way as the match expressions we defined to handle the Result values in Listing 9-6. If the value of the Result is an Ok, the value inside the Ok will get returned from this expression, and the program will continue. If the value is an Err, the Err will be returned from the whole function as if we had used the return keyword so the error value gets propagated to the calling code."
- errors3
- HAVE to revisit error5 - > great pre-intro to Box<dyn
Trait> - error6 map_err for transforming Err type in Result into a new error value of the same type.
- Revisit error6 => HARD
- trait3 -> very important for understanding default implementation and overrides. Also reread this page: https://doc.rust-lang.org/book/ch10-02-traits.html#default-implementations. Answer also here: https://users.rust-lang.org/t/rustlings-traits3-rs-question/80742/3
- trait5 -> important to understand trait bounds with generics. Also be sure to understand the short format vs. clearer format and pros/cons
- Retake quiz3 for more traits+generics practice
- lifetimes1
- standard library types iterators2 -> VERY IMPORTANT to understand map, chain/chain::<Vec>, join
- iterator4 to make sure you understand fold/rfold
- iterator5 to make sure you understand looping through hashmaps with filter, flat_map, count
- box.rs for smart pointer to allocate memory in recursive types
- arc.rs for atomic reference counters, moving ownershup to thread::spawn.
- rc.rs Rc::strong_count, Rc::new and Rc::clone, and drop(). Also note "In summary, if you need shared ownership in a single-threaded context, you can use Rc. If you need shared ownership across multiple threads, you should use Arc." Rc is faster and smaller than Arc
- Cow
- All threads exercises :(. handles and join methods for thread completion wait in the main thread.
- threads2 exercises important for understanding synchorization primitize Mutex
- threads3 - again - all threads exercises.
- all macros
- Conversions from_str be sure to understand map_err() for error projection!
- All conversions man:
let x_ref = &mut x; let x_ref2 = x_ref.as_mut(); // convert to mutable reference *x_ref2 = 10; // modify the value assert_eq!(x, 10); In this example, x_ref is a mutable reference to x. We can use the as_mut method to convert x_ref to a mutable reference, which we store in x_ref2. We can then use x_ref2 to modify the value of x.```