1
4

Welcome to week 20 of Reading Club for Rust’s “The Book” (“The Rust Programming Language”).

“The Reading”

Chapter 12.5: “Reading A File" The Book: https://rust-book.cs.brown.edu/ch12-05-working-with-environment-variables.html (the special Brown University version with quizzes etc)

The Twitch Stream

Starting today within the half hour @sorrybookbroke@sh.itjust.works twitch stream on this chapter: https://www.twitch.tv/deerfromsmoke

https://www.youtube.com/watch?v=ou2c5J6FmsM&list=PL5HV8OVwY_F9gKodL2S31czb7UCwOAYJL (YouTube Playlist)

Be sure to catch future streams (will/should be weekly: https://www.twitch.tv/deerfromsmoke)

2
7
submitted 4 days ago* (last edited 3 days ago) by Jayjader@jlai.lu to c/learningrustandlemmy@lemmy.ml

What?

I will be holding the fourteenth of the secondary slot/sessions for the Reading Club, also on "The Book" ("The Rust Programming Language"). We are using the Brown University online edition (that has some added quizzes & interactive elements).

Last time we completed chapter 6 (enums & pattern matching). This time we will begin chapter 7 (Managing Growing Projects with Packages, Crates, and Modules).

Previous session details and recording can be found in the following lemmy post: https://jlai.lu/post/7773753

Why?

This slot is primarily to offer an alternative to the main reading club's streams that caters to a different set of time zone preferences and/or availability.

(also, obviously, to follow up on the previous session)

When ?

Currently, I intend to start at 18:00 UTC+2 (aka 6pm Central European Time) on this day (2023-06-24). If you were present for a previous session, then basically the same time-of-day and day-of-week as that one was.

Here's the recording: https://youtu.be/pUqVmPRLhNE

Please comment if you are interested in joining because you can't make the main sessions but would prefer a different start time (and include a time that works best for you in your comment!). Caveat: I live in central/western Europe; I can't myself cater to absolutely any preference.

How ?

The basic format is: I will be sharing my computer screen and voice through an internet live stream (hosted at https://www.twitch.tv/jayjader for now). The stream will simultaneously be recorded locally and uploaded afterwards to youtube (also, for now).

I will have on-screen:

  • the BU online version of The Book
  • a terminal session with the necessary tooling installed (notably rustup and through it cargo & "friends")
  • some form of visual aid (currently a digital whiteboard using www.excalidraw.com)
  • the live stream's chat

I will steadily progress through the book, both reading aloud the literal text and commenting occasionally on it. I will also perform any code writing and/or terminal commands as the text instructs us to.

People who either tune in to the live stream or watch/listen to the recording are encouraged to follow along with their own copy of the book.

I try to address any comments from live viewers in the twitch chat as soon as I am aware of them. If someone is having trouble understanding something, I will stop and try to help them get past it.

Who ?

You! (if you're interested). And, of course, me.

3
5
submitted 1 week ago* (last edited 1 week ago) by maegul@lemmy.ml to c/learningrustandlemmy@lemmy.ml

After Chs 5 and 6 (see the reading club post here), we get a capstone quiz that covers ownership along with struts and enums.

So, lets do the quiz together! If you've done it already, revisiting might still be very instructive! I certainly thought these questions were useful "revision".


I'll post a comment for each question with the answer, along with my own personal notes (and quotes from The Book if helpful), behind spoiler tags.

Feel free to try to answer in a comment before checking (if you dare). But the main point is to understand the point the question is making, so share any confusions/difficulties too, and of course any corrections of my comments/notes!.

4
5

Finally, we can make our own types (or data structures)!!


This is supplementary/separate from the Twitch Streams (see sidebar for links), intended for discussion here on lemmy.

The idea being, now that both twitch streams have read Chapters 5 and 6, we can have a discussion here and those from the twitch streams can have a retrospective or re-cap on the topic.

This will be a regular occurrence for each discrete set of topics coming out of The Book as the twitch streams cover them


With Ch 4 on the borrow checker out of the way, chapters 5 & 6 feel like the "inflection point" ... the point where we're ready to actually start programming in rust.

Custom types, data structures, objects with methods, pattern matching, and even dipping into rust's traits system and it's quasi answer to class inheritance.

If you're comfortable enough with the borrow checker, you can really start to program with rust now!


I personally didn't think this content was difficult, though it prompts some interesting points and topics (which I'll mention in my own comment below).

  • Any thoughts, difficulties or confusions?
  • Any quizzes stump you?
  • Any major tips or rules of thumb you've taken away or generally have about using structs and enums?
5
4

Continuing on from Chs 5 & 6 of "The Book" (see "Reading Club" post here), I don't think the Copy and Clone traits were quite given sufficient coverage.

So I thought I'd post my understanding here.

Tl;Dr

Copy Clone
Implicit Explicit (v.clone())
Simple (memcpy) Arbitrary
"cheap"/quick Potentially expensive
Simple types Any type

Derivable Traits

  • These are traits which have a standard implementation that can be freely and easily applied to structs and enums (IE, custom types).
  • The ones available in the standard library are listed in Appendix C of The Book. Other libraries/crates can apparently implement them too (though I don't know of any).
  • They are part of and use the Attributes syntax (see Documentation in the Rust Reference here): #[ATTRIBUTE].
  • To derive a trait we write #[derive(TRAIT1, TRAIT2, ...)] above our type declaration
#[derive(Copy, Clone)]
struct Copyable {
    field: i32,
}

#[derive(Clone)]
struct OnlyClonable {
    field: i32,
}

The Three Step Ladder

  • The two traits, Clone and Copy, are about providing opt-in options for custom types around what "ownership semantics" they obey.
  • "move semantics": are what we know for most types and have learnt about in ch 4. There is no copying, only the moving of ownership from one stack to another or the use of references and the "borrow checker" that verifies safety.
  • "Copy semantics": are what basic types like i32 enjoy. No ownership movements. Instead, these variables get implicitly copied, because they're simple and copying involves the same work involved in passing a memory address around.

The RFC for these traits puts it nicely ...

From RFC 0019 - Opt in built-in traits document on the Copy Trait

Effectively, there is a three step ladder for types:

  • If you do nothing, your type is linear, meaning that it moves from place to place and can never be copied in any way. (We need a better name for that.)
  • If you implement Clone, your type is cloneable, meaning that it moves from place to place, but it can be explicitly cloned. This is suitable for cases where copying is expensive.
  • If you implement Copy, your type is copyable, meaning that it is just copied by default without the need for an explicit clone. This is suitable for small bits of data like ints or points.

What is nice about this change is that when a type is defined, the user makes an explicit choice between these three options.

IE, "move semantics" are the default, "copy semantics" can be adopted, or clone for the more complicated data types or for where it is desired for duplication to be explicit.

  • Note that Clone is a supertrait of Copy, meaning that we have to derive Clone if we want to derive Copy, but can derive Clone on its own.
struct Movable {
	field: i32
}

#[derive(Clone)]
struct OnlyClonable {
    field: i32,
}

#[derive(Copy, Clone)]
struct Copyable {
    field: i32,
}

Example

Demonstrate how a struct with Copy obeys "copy semantics" and gets copied implicitly instead of "moved"

  • Declare structs, with derived traits, and define a basic function for taking ownership
fn check_if_copied<T: Clone>(x: T) -> T {
    println!("address: {:p} (from inner owning function)", &x);

    x
}

#[derive(Clone)]
struct OnlyClonable {
    field: i32,
}

#[derive(Copy, Clone)]
struct Copyable {
    field: i32,
}
  • Instantiate variables of both structs, cl that has Clone and cp that has Copy.
  • cl is moved into check_if_copied and so is no longer live or usable afterward.
  • cp is not moved into check_if_copied and lives beyond the call of check_if_copied.
let cl = OnlyClonable{field: 0};
let cp = Copyable{field: 1};


// OnlyClonable type obeys "move semantics"

check_if_copied(cl);  // cl gets moved in as it's not copyable

// COMPILER ERROR.  Can't do this! As moved into `report_if_copied`!
println!("address: {:p}", &cl);

// Copyable obeys "copy semantics"

check_if_copied(cp);  // cp is implicitly copied here!

// Can! as not moved but copied
println!("address: {:p}", &cp);

Demonstrate the same but with mutation

let mut mcp = Copyable{field: 1};

let mcp2 = check_if_copied(mcp);  // as mcp was implicitly copied, mcp2 is a new object
mcp.field += 100;

// values will be different, one was mutated and has kept the data from before the mutation
println!("mcp field: {}", mcp.field);
println!("mcp2 field: {}", mcp2.field);

prints ...

mcp field: 101
mcp2 field: 1

Application and Limitations

Copy

  • Copy is available only on types whose elements also have Copy.
  • Such elements then need to be the numeric types (i32, f64 etc), bool and char. So custom types that contain only basic data types.
#[derive(Copy, Clone)]
struct Copyable {
    field: i32,
}
  • Any field with a non-copyable type such as String or Vec cannot be made Copyable
// Copy cannot be derived as `f2: String` does not implement Copy
#[derive(Copy, Clone)]
struct NotCopyable2 {
    field: i32,
    f2: String
}
  • But custom types that have the Copy trait as fields work fine, like Copyable from above as a field:
#[derive(Copy, Clone)]
struct Copyable2 {
    field: i32,
    more: Copyable
}
  • Beyond this, Copy is not overloadable and can't be implemented in rust (without using unsafe presumably). It's really just a primitive of the language it seems (see source code for the Copy trait).

Clone

  • Like Copy, Clone relies on the struct's fields also implementing Clone.
  • A number of standard library types have implemented Clone (see list of implementors in the documentation), including the fundamental collections you'll find in chapter 8 of The Book: String, Vec, HashMaps and also arrays.
  • Thus the code below, which involves a more complex Struct with fields that are a String, array and Vec, compiles just fine.
  • With the clone() method, Clonable is now able to be duplicated allowing the original to be usable after being passed in to check_if_copied().
#[derive(Clone)]
struct Clonable {
    name: String,
    values: [f64; 3],
    data: Vec<i32>
}

let clonable = Clonable{
    name: "Sam".to_string(),
    values: [1.0, 2.0, 3.0],
    data: vec![111, 222]
};

// clonable is duplicated with the `.clone()` method
check_if_copied(clonable.clone());

// original still usable as it was never moved
println!("Name; {}", clonable.name);
  • But, unlike Copy, is overloadable, which means you can implemented Clone for your custom types however you want if necessary.
  • This would be jumping ahead a bit to Traits, but we could implement Clone for our struct above ourselves with something like the below:
struct Clonable {
    name: String,
    values: [f64; 3],
    data: Vec<i32>
}

// Just use each field's `.clone()` implementation, much like the default would do
impl Clone for Clonable {
    fn clone(&self) -> Self {
        Self {
            name: self.name.clone(),
            values: self.values.clone(),
            data: self.data.clone()
        }
    }
}
  • Or we could see how Clone is implemented for Option:
impl<T> Clone for Option<T>
where
    T: Clone,
{
    fn clone(&self) -> Self {
        match self {
            Some(x) => Some(x.clone()),
            None => None,
        }
    }
}
  • Basically relies on the implementation of Clone for the inner value inside Some. Note the where clause that limits this to Option variables that contain values that have the Clone trait.

Deep or Shallow Duplication

  • In the case of Copy, duplication should always be "deep".
    • Which isn't saying much due to the simplicity of the types that can implement Copy.
  • In the case of Clone ... it depends!
    • As the implementations of Clone on the fields of a custom struct/enum are relied on, whether the duplication is deep or shallow depends entirely on those implementations.
    • As stated in the RFC quoted above, Clone is for complex data structures whose duplication is not trivial such that compromises around performance and duplication depth may need to be made.
    • A clue can be discerned from the signature of the implementation. For Option, above, the inner value was restricted to also having implemented Clone, as the value's .clone() method was relied on. Therefore, Option's is deep.
    • Similarly, the Clone implementation for Vec has the same restriction on its elements: impl<T, A> Clone for Vec<T, A> where T: Clone, (see source code), indicating that its implementation is at least one level deep.

Overall, this seemed a fundamental part of the language, and I found it weird that The Book didn't address it more specifically. There's nothing really surprising or difficult here, but the relative roles of Clone and Copy, or the "three step ladder" are important to appreciate I think.

6
16

Relevant for @sorrybookbroke@sh.itjust.works 's next stream next week as they're hitting smart pointers.

cross-posted from: https://programming.dev/post/16059115

Found this on Mastodon https://fosstodon.org/@dpom/112681955888465502 , and it is a very nice overview of the containers and their layout.

7
13

cross-posted from: https://lemmy.ml/post/17090253

cross-posted from: https://lemmy.ml/post/17090149

Hi! I've created a CLI tool for downloading Rust web books (like The Rust Programming Language) as EPUB, so that you can easily read them on your e-book reader. The tool is heavily based on this gist and a lot of proompting.

Check it out here: https://github.com/mawkler/rust-book-to-epub

8
20
submitted 1 week ago* (last edited 1 week ago) by Jayjader@jlai.lu to c/learningrustandlemmy@lemmy.ml

What?

I will be holding the thirteenth of the secondary slot/sessions for the Reading Club, also on "The Book" ("The Rust Programming Language"). We are using the Brown University online edition (that has some added quizzes & interactive elements).

Last time we started chapter 6 (enums & pattern matching). We read through 6.1 and learned how to define enum variants in tuple or struct form. We also learned about the Option<T> enum that Rust provides us with. This time we'll begin section 6.2 and learn about the match control flow construct.

Previous session details and recording can be found in the following lemmy post: https://jlai.lu/post/7532130

Why?

This slot is primarily to offer an alternative to the main reading club's streams that caters to a different set of time zone preferences and/or availability.

(also, obviously, to follow up on the previous session)

When ?

Currently, I intend to start at 18:00 UTC+2 (aka 6pm Central European Time) on Monday (2023-06-17). If you were present for a previous session, then basically the same time-of-day and day-of-week as that one was.

EDIT: here's the recording https://youtu.be/W1fjxCwtwfM

Please comment if you are interested in joining because you can't make the main sessions but would prefer a different start time (and include a time that works best for you in your comment!). Caveat: I live in central/western Europe; I can't myself cater to absolutely any preference.

How ?

The basic format is: I will be sharing my computer screen and voice through an internet live stream (hosted at https://www.twitch.tv/jayjader for now). The stream will simultaneously be recorded locally and uploaded afterwards to youtube (also, for now).

I will have on-screen:

  • the BU online version of The Book
  • a terminal session with the necessary tooling installed (notably rustup and through it cargo & "friends")
  • some form of visual aid (currently a digital whiteboard using www.excalidraw.com)
  • the live stream's chat

I will steadily progress through the book, both reading aloud the literal text and commenting occasionally on it. I will also perform any code writing and/or terminal commands as the text instructs us to.

People who either tune in to the live stream or watch/listen to the recording are encouraged to follow along with their own copy of the book.

I try to address any comments from live viewers in the twitch chat as soon as I am aware of them. If someone is having trouble understanding something, I will stop and try to help them get past it.

Who ?

You! (if you're interested). And, of course, me.

9
8

Welcome to week 17 of Reading Club for Rust’s “The Book” (“The Rust Programming Language”).

“The Reading”

Chapter 12.5: “Reading A File" The Book: https://rust-book.cs.brown.edu/ch12-05-working-with-environment-variables.html (the special Brown University version with quizzes etc)

The Twitch Stream

Starting today within the half hour @sorrybookbroke@sh.itjust.works twitch stream on this chapter: https://www.twitch.tv/deerfromsmoke

https://www.youtube.com/watch?v=ou2c5J6FmsM&list=PL5HV8OVwY_F9gKodL2S31czb7UCwOAYJL (YouTube Playlist)

Be sure to catch future streams (will/should be weekly: https://www.twitch.tv/deerfromsmoke)

10
10
submitted 2 weeks ago* (last edited 2 weeks ago) by Jayjader@jlai.lu to c/learningrustandlemmy@lemmy.ml

What?

I will be holding the twelfth of the secondary slot/sessions for the Reading Club, also on "The Book" ("The Rust Programming Language"). We are using the Brown University online edition (that has some added quizzes & interactive elements).

Last time we wrapped up chapter 5 (structs). This session we'll be learning about enums by starting chapter 6.

Previous session details and recording can be found in the following lemmy post: https://jlai.lu/post/7413233

Why?

This slot is primarily to offer an alternative to the main reading club's streams that caters to a different set of time zone preferences and/or availability.

(also, obviously, to follow up on the previous session)

When ?

Currently, I intend to start at 18:00 UTC+2 (aka 6pm Central European Time) on Monday (2023-06-10). If you were present for a previous session, then basically the same time-of-day and day-of-week as that one was.

EDIT: here's the recording https://youtu.be/eRMxhaJIOAg

Please comment if you are interested in joining because you can't make the main sessions but would prefer a different start time (and include a time that works best for you in your comment!). Caveat: I live in central/western Europe; I can't myself cater to absolutely any preference.

How ?

The basic format is: I will be sharing my computer screen and voice through an internet live stream (hosted at https://www.twitch.tv/jayjader for now). The stream will simultaneously be recorded locally and uploaded afterwards to youtube (also, for now).

I will have on-screen:

  • the BU online version of The Book
  • a terminal session with the necessary tooling installed (notably rustup and through it cargo & "friends")
  • some form of visual aid (currently a digital whiteboard using www.excalidraw.com)
  • the live stream's chat

I will steadily progress through the book, both reading aloud the literal text and commenting occasionally on it. I will also perform any code writing and/or terminal commands as the text instructs us to.

People who either tune in to the live stream or watch/listen to the recording are encouraged to follow along with their own copy of the book.

I try to address any comments from live viewers in the twitch chat as soon as I am aware of them. If someone is having trouble understanding something, I will stop and try to help them get past it.

Who ?

You! (if you're interested). And, of course, me.

11
8
submitted 3 weeks ago* (last edited 3 weeks ago) by Jayjader@jlai.lu to c/learningrustandlemmy@lemmy.ml

Stable internet connection re-acquired! To avoid waiting another full week, I'll be hosting the session today (approximately 6-7 hours after this post is created).

What?

I will be holding the eleventh of the secondary slot/sessions for the Reading Club, also on "The Book" ("The Rust Programming Language"). We are using the Brown University online edition (that has some added quizzes & interactive elements).

Last time, the book guided us through An Example Program Using Structs (section 2 of chapter 5). Today we'll be tackling the following section, "The Method Syntax" (5.3).

Previous session details and recording can be found in the following lemmy post: https://jlai.lu/post/6871662

Why?

This slot is primarily to offer an alternative to the main reading club's streams that caters to a different set of time zone preferences and/or availability.

(also, obviously, to follow up on the previous session)

When ?

Currently, I intend to start at 18:00 UTC+2 (aka 6pm Central European Time) on Tuesday (2023-06-04). If you were present for a previous session, then basically the same time-of-day ~~and day-of-week~~ as that one was. Exceptionally, today is not the same day-of-week as previously.

Recording of the session: https://youtu.be/wBYdDbADFLU

Please comment if you are interested in joining because you can't make the main sessions but would prefer a different start time (and include a time that works best for you in your comment!). Caveat: I live in central/western Europe; I can't myself cater to absolutely any preference.

How ?

The basic format is: I will be sharing my computer screen and voice through an internet live stream (hosted at https://www.twitch.tv/jayjader for now). The stream will simultaneously be recorded locally and uploaded afterwards to youtube (also, for now).

I will have on-screen:

  • the BU online version of The Book
  • a terminal session with the necessary tooling installed (notably rustup and through it cargo & "friends")
  • some form of visual aid (currently a digital whiteboard using www.excalidraw.com)
  • the live stream's chat

I will steadily progress through the book, both reading aloud the literal text and commenting occasionally on it. I will also perform any code writing and/or terminal commands as the text instructs us to.

People who either tune in to the live stream or watch/listen to the recording are encouraged to follow along with their own copy of the book.

I try to address any comments from live viewers in the twitch chat as soon as I am aware of them. If someone is having trouble understanding something, I will stop and try to help them get past it.

Who ?

You! (if you're interested). And, of course, me.

12
17

A nice comment in a forum thread (extracted below, but also see the shorter more facetious version below that) about references and their lifetimes in structs. Here is a link to the full thread over on users.rust-lang.org

I feel like I needed to hear or read this, and I feel like this sort of clarification is not put front and centre enough in rust learning material (as others in the thread say too). "The Book" certainly doesn't seem interested in clarifying perspectives like this.


The Comment

Other languages use term "reference" for storing things "by reference" or just referencing any object anywhere in general. It's not like that in Rust.

What Rust calls "reference" is a much more specific thing, that is no so general-purpose. It has a narrower, restrictive usage. Rust references are more like read-only or write-exclusive locks. They make their target unmovable and immutable for entire duration of their existence. They can't exist on their own, only as a counterpart of an owned value.

References in structs also make the whole struct itself temporary, and everything that touches that struct becomes temporary and tied to the scope of the borrowed value that started it.

If these restrictions (that cause you fight with the borrow checker) aren't what you want to achieve, then you don't want temporary references.

99% of the time when you need to store something "by reference", Box (or Arc or String or PathBuf or Vec or some other owned type) is the right answer.

Note that &T and Box<T> have identical representation in memory — a pointer. They differ by ownership.

In Short

From here

You're not allowed to use references in structs until you think Rust is easy. They're the evil-hardmode of Rust that will ruin your day.

😉

Use Box or Arc to store things in structs "by reference". Temporary borrows don't do what you think they do.

13
9

Sorry y'all, I don't have access to a decent internet connection for the time being.

14
7

This is supplementary/separate from the Twitch Streams (see sidebar for links), intended for discussion here on lemmy.

The idea being, now that both twitch streams have read Chapter 4, we can have a discussion here and those from the twitch streams can have a retrospective or re-cap on the topic.

This will be a regular occurrence for each discrete set of topics coming out of The Book as the twitch streams cover them


Ownership and the borrow checker are obviously a fundamental and unique topic to rust, so it's well worth getting a good grounding in AFAICT.

  1. Anyone up to trying to summarise or explain ownership/borrow-checker in rust?
    • it can be a good exercise to test your understanding and get feedback/clarification from others ... as well as probably a good way to teach others
  2. Any persistent gripes, difficulties or confusions?
  3. Any of the quizzes from The Book stump you?
  4. Any hard learnt lessons? Or tried and true tips?
15
11
submitted 1 month ago* (last edited 1 month ago) by Jayjader@jlai.lu to c/learningrustandlemmy@lemmy.ml

What?

I will be holding the tenth of the secondary slot/sessions for the Reading Club, also on "The Book" ("The Rust Programming Language"). We are using the Brown University online edition (that has some added quizzes & interactive elements).

Last time we covered defining and instantiating structs with section 1 of chapter 5, "Using Structs to Structure Related Data". We'll be continuing with section 2, where we'll be writing some code!

Previous session details and recording can be found in the following lemmy post: https://jlai.lu/post/6703544

Why?

This slot is primarily to offer an alternative to the main reading club's streams that caters to a different set of time zone preferences and/or availability.

(also, obviously, to follow up on the previous session)

When ?

Currently, I intend to start at 18:00 UTC+2 (aka 6pm Central European Time) on Monday (2023-05-20). If you were present for a previous session, then basically the same time-of-day and day-of-week as that one was.

Please comment if you are interested in joining because you can't make the main sessions but would prefer a different start time (and include a time that works best for you in your comment!). Caveat: I live in central/western Europe; I can't myself cater to absolutely any preference.

How ?

The basic format is: I will be sharing my computer screen and voice through an internet live stream (hosted at https://www.twitch.tv/jayjader for now). The stream will simultaneously be recorded locally and uploaded afterwards to youtube (also, for now).

EDIT: here's the recording https://youtu.be/s0U7KBXxL8g

I will have on-screen:

  • the BU online version of The Book
  • a terminal session with the necessary tooling installed (notably rustup and through it cargo & "friends")
  • some form of visual aid (currently a digital whiteboard using www.excalidraw.com)
  • the live stream's chat

I will steadily progress through the book, both reading aloud the literal text and commenting occasionally on it. I will also perform any code writing and/or terminal commands as the text instructs us to.

People who either tune in to the live stream or watch/listen to the recording are encouraged to follow along with their own copy of the book.

I try to address any comments from live viewers in the twitch chat as soon as I am aware of them. If someone is having trouble understanding something, I will stop and try to help them get past it.

Who ?

You! (if you're interested). And, of course, me.

16
5
17
15
submitted 1 month ago* (last edited 1 month ago) by maegul@lemmy.ml to c/learningrustandlemmy@lemmy.ml

We've got two parallel streams going here. One is up to chapter 10 on Traits and the other on chapter 5 on Structs & Enums.

  • How are we feeling about Rust the language?
  • Any persistent confusions or difficulties?
  • Favourite features or success stories?
  • How are we finding "The Book" in general?
    • Personally, I think it's good but not great and am definitely reaching out for other learning experiences or materials, lately finding myself going through the Std Lib Docs a bit
    • Andy Balaam's Rust Tutorial Series over on peertube are also good and I recently remembered to watch them as I go

Otherwise ... any thoughts or requests on what else can happen here for those going through "The Book"?

  • I'm thinking of having posts on sets of chapters once the two twitch streams have gotten up to them.
  • So right now, both have gotten through the borrow checker chapter (ch 4).
  • The idea would be to have a reading club happen here too ... to allow written discussion/questions here for those not able to make the streams (or who like/prefer written discussion), but also to provide a retrospective for those who've gone through the streams.
  • Personally, in these discussions I'd post my understanding of the topic, look back on the quizzes to see what tripped me up, or any other practical issues I ran into, and post anything else I may have found that helped me on the topic. Basically to see what I actually learned from that chapter.
  • Thoughts??
  • Another thing I can think of is challenges and exercises. I tried one a while back, but I think it was too much/long, so smaller exercises would probably work better for getting us thinking/coding in rust. AoC has come up and there are plenty of others. Would regular posts from such a thing be welcome or helpful??
18
16
submitted 1 month ago* (last edited 1 month ago) by Jayjader@jlai.lu to c/learningrustandlemmy@lemmy.ml

Ownership is finally over! Ok, I know we're going to be seeing more of it throughout the rest of the book, but at least it should always be in the context of "doing" something else/useful. For example, grouping bits of related data into structs.

What?

I will be holding the ninth of the secondary slot/sessions for the Reading Club, also on "The Book" ("The Rust Programming Language"). We are using the Brown University online edition (that has some added quizzes & interactive elements).

This week we begin chapter 5 "Using Structs to Structure Related Data"!

Previous session details and recording can be found in the following lemmy post: https://jlai.lu/post/6557213

Why?

This slot is primarily to offer an alternative to the main reading club's streams that caters to a different set of time zone preferences and/or availability.

(also, obviously, to follow up on the previous session)

When ?

Currently, I intend to start at 18:00 UTC+2 (aka 6pm Central European Time) on Monday (2023-05-13). If you were present for a previous session, then basically the same time-of-day and day-of-week as that one was.

Please comment if you are interested in joining because you can't make the main sessions but would prefer a different start time (and include a time that works best for you in your comment!). Caveat: I live in central/western Europe; I can't myself cater to absolutely any preference.

How ?

The basic format is: I will be sharing my computer screen and voice through an internet live stream (hosted at https://www.twitch.tv/jayjader for now). The stream will simultaneously be recorded locally and uploaded afterwards to youtube (also, for now).

Edit: here's the link to the recording https://youtu.be/h4l5Ksd5w7E

I will have on-screen:

  • the BU online version of The Book
  • a terminal session with the necessary tooling installed (notably rustup and through it cargo & "friends")
  • some form of visual aid (currently a digital whiteboard using www.excalidraw.com)
  • the live stream's chat

I will steadily progress through the chapter, both reading aloud the literal chapter text and commenting occasionally on it. I will also perform any code writing and/or terminal commands as the text instructs us to.

People who either tune in to the live stream or watch/listen to the recording are encouraged to follow along with their own copy of the book.

I try to address any comments from live viewers in the twitch chat as soon as I am aware of them. If someone is having trouble understanding something, I will stop and try to help them get past it.

Who ?

You! (if you're interested). And, of course, me.

19
8

Welcome to week 14 of Reading Club for Rust’s “The Book” (“The Rust Programming Language”).

Starting today within the hour “The Reading”

Chapter 10: “Traits: Defining Shared Behavior" - continued The Book: https://rust-book.cs.brown.edu/ch05-01-defining-structs.html (the special Brown University version with quizzes etc)

The Twitch Stream

@sorrybookbroke@sh.itjust.works twitch stream on this chapter: https://www.twitch.tv/deerfromsmoke

https://www.youtube.com/watch?v=ou2c5J6FmsM&list=PL5HV8OVwY_F9gKodL2S31czb7UCwOAYJL (YouTube Playlist)

Be sure to catch future streams (will/should be weekly: https://www.twitch.tv/deerfromsmoke)

20
10
submitted 1 month ago* (last edited 1 month ago) by Jayjader@jlai.lu to c/learningrustandlemmy@lemmy.ml

What?

I will be holding the eighth of the secondary slot/sessions for the Reading Club, also on "The Book" ("The Rust Programming Language"). We are using the Brown University online edition (that has some added quizzes & interactive elements).

This week we finish chapter 4: "Understanding Ownership" by reading through the "Ownership Recap (4.5).

Previous session details and recording can be found in the following lemmy post: https://jlai.lu/post/6353244

Why?

This slot is primarily to offer an alternative to the main reading club's streams that caters to a different set of time zone preferences and/or availability.

(also, obviously, to follow up on the previous session)

When ?

Currently, I intend to start at 18:00 UTC+2 (aka 6pm Central European Time) on Monday (2023-05-06). That's around 4 hours after this post is created. If you were present for a previous session, then basically the same time-of-day and day-of-week as that one was.

Please comment if you are interested in joining because you can't make the main sessions but would prefer a different start time (and include a time that works best for you in your comment!). Caveat: I live in central/western Europe; I can't myself cater to absolutely any preference.

How ?

The basic format is: I will be sharing my computer screen and voice through an internet live stream (hosted at https://www.twitch.tv/jayjader for now). The stream will simultaneously be recorded locally and uploaded afterwards to youtube (also, for now).

EDIT: here's the recording: https://youtu.be/3w7m5GM7eV8

I will have on-screen:

  • the BU online version of The Book
  • a terminal session with the necessary tooling installed (notably rustup and through it cargo & "friends")
  • some form of visual aid (currently a digital whiteboard using www.excalidraw.com)
  • the live stream's chat

I will steadily progress through the chapter, both reading aloud the literal chapter text and commenting occasionally on it. I will also perform any code writing and/or terminal commands as the text instructs us to.

People who either tune in to the live stream or watch/listen to the recording are encouraged to follow along with their own copy of the book.

I try to address any comments from live viewers in the twitch chat as soon as I am aware of them. If someone is having trouble understanding something, I will stop and try to help them get past it.

Who ?

You! (if you're interested). And, of course, me.

21
22

This might be a more interesting dive into Rust for those with a fair amount of existing c and/or c++.

I tried it out myself a few years ago. I had fun reliving the nightmare of implementing doubly-linked lists in C back in school! I never made it to the end of the book, though; it got wayyyy more complex around halfway than I could process at the time.

22
12
submitted 2 months ago* (last edited 1 month ago) by Jayjader@jlai.lu to c/learningrustandlemmy@lemmy.ml

Hi all! So much happening in my personal life these past 2 weeks that I couldn't put aside the time or energy to host these sessions. Things are calming down a bit (plus I've missed doing the sessions), and so I'm happy to announce the date for the next session.

What?

I will be holding the seventh of the secondary slot/sessions for the Reading Club, also on "The Book" ("The Rust Programming Language"). We are using the Brown University online edition (that has some added quizzes & interactive elements).

This week we will be continuing chapter 4: "Understanding Ownership". Last session we finished "Fixing Ownership Errors" (4.3). We will thus start from the beginning of "The Slice Type" (4.4).

Previous session details and recording can be found in the following lemmy post: https://jlai.lu/post/5991675

Why?

This slot is primarily to offer an alternative to the main reading club's streams that caters to a different set of time zone preferences and/or availability.

(also, obviously, to follow up on the previous session)

When ?

Currently, I intend to start at 18:00 UTC+2 (aka 6pm Central European Time) on Monday (2023-04-29). If you were present for a previous session, then basically the same time-of-day and day-of-week as that one was.

Please comment if you are interested in joining because you can't make the main sessions but would prefer a different start time (and include a time that works best for you in your comment!). Caveat: I live in central/western Europe; I can't myself cater to absolutely any preference.

How ?

The basic format is: I will be sharing my computer screen and voice through an internet live stream (hosted at https://www.twitch.tv/jayjader for now). The stream will simultaneously be recorded locally and uploaded afterwards to youtube (also, for now). Edit: here's the recording: https://youtu.be/OeyWDSJ-Y5E

I will have on-screen:

  • the BU online version of The Book
  • a terminal session with the necessary tooling installed (notably rustup and through it cargo & "friends")
  • some form of visual aid (currently a digital whiteboard using www.excalidraw.com)
  • the live stream's chat

I will steadily progress through the chapter, both reading aloud the literal chapter text and commenting occasionally on it. I will also perform any code writing and/or terminal commands as the text instructs us to.

People who either tune in to the live stream or watch/listen to the recording are encouraged to follow along with their own copy of the book.

I try to address any comments from live viewers in the twitch chat as soon as I am aware of them. If someone is having trouble understanding something, I will stop and try to help them get past it.

Who ?

You! (if you're interested). And, of course, me.

23
14

Just place to keep links to comments from this community that go "above and beyond" in helping someone out and really explaining or teaching.

There'll be a link in the side bar.

Feel free to add any links you like with a comment

24
9
submitted 2 months ago* (last edited 2 months ago) by maegul@lemmy.ml to c/learningrustandlemmy@lemmy.ml

Intro

I'm not on top of traits or generics but found myself looking some of them up anyhow, and came across the Sum trait.

Here is the Std Lib documentation on Sum (I believe).

And I guess all of the generics and/or type logic and how they interoperate has thrown me for a bit of a spin ... so I thought I'd put my thoughts here. Maybe I'll work things out in writing it or maybe someone here can help me/us out?

A bit long ... sorry


Trait Definition

From the docs and source, here is the trait's signature:

// core::iter::Sum
pub trait Sum<A = Self>: Sized {
    // Required method
    fn sum<I: Iterator<Item = A>>(iter: I) -> Self;
}

First thoughts: Defined on elements not iterators?

  • The part that confused me at first was what Self is actually. Naively, I imagined it was referring to the iterator (or type that'd implemented Iterator) ... but that clearly can't be true because the return type is Self.
  • So ... Sum is implemented not on any collection but on the element type?!
  • If so, why not rely on the Add Trait at the element level, which is responsible for the addition operator (see docs here)?

Kinda seems so?

  • So, in trying to understand this, I thought I'd look at the source of Iterator::sum() first figuring that it'd be the main implementation.
  • This is the sum you'd be calling in something like vec![1, 2, 3].into_iter().sum() to get 6.
core::iter::Iterator::sum
fn sum<S>(self) -> S
where
    Self: Sized,
    S: Sum<Self::Item>,
{
    Sum::sum(self)
}
  • Ok, so the call of Sum::sum(self) clearly indicates that this is not where Sum is defined (instead it must be in Sum::sum() somehow).
  • Moreover, self is being passed into Sum::sum(), withself being the Iterator here ... which means there's no method being called on Iterator itself but something from another module.
  • Additionally, this method is bound by the generic <S> which is defined in the where clause as Sum<Self::Item> ... which ... wait WTF is going on?
    • So this method (Iterator::sum()) must return a type that has implemented the trait Sum??
    • If that's correct, then that confirms my suspicion that Sum is implemented on the elements of an iterator (where I'm sure those comfortable with the generics syntax of the definition above are yelling YES!! OF course!!)
    • That's because the return type of sum() would generally have to be the same type as the summed elements, so S is both the type of the elements in the iterator and the return type of sum. All good.
    • And indeed, in the definition of the type alias S we've got Sum<Self::Item> which binds the return type of Iterator::sum() to the type of the iterator's elements (ie Self::Item)
      • Self::Item is technically the Item type of the Iterator which can, AFAIU, be defined as distinct from the type of the elements of the collection from which the iterator is derived but that's another story.

Back to the beginning

  • So back to trying to understand the definition of core::iter::Sum (which I believe is the definition of the trait):
// core::iter::Sum
pub trait Sum<A = Self>: Sized {
    // Required method
    fn sum<I: Iterator<Item = A>>(iter: I) -> Self;
}
  • The trait itself is bound to Sized. I don't know the details around Sized (see docs here and The book, ch 19.4 here) but it seems fundamental likely that it applies to vectors and the like.
  • The generic A = Self and its occurrences in the generics for the sum() function and its return type ... are a lot:
    • AFAIU, Self, ie the type on Sum is implemented for, must be the Item type for the Iterator that will be passed into the sum method.
    • But it must also be the return type of sum() ... which makes sense.
  • So the confusing part here then is the generic type of the sum() method: <I: Iterator<Item = A>>.
    • Remember, A = Self, so it's really <I: Iterator<Item = Self>> (right?)
    • This generic type is any Iterator whose Item (ie, the type that is returned each iteration) is the same type as Self.
  • Which means that if I want to sum a vector if i32 numbers, I'd have to make sure I've implemented Sum not on Vec but on i32 and defined it as a method that takes any iterator of i32 (ie Self) elements to then return an i32 element.
  • Ok ....

Confirmation

  • We can look at the implementors of core::iter::Sum ( see docs here) and check the source for the i32 implementation ...
  • Which gives us this source code:
integer_sum_product! { i8 i16 i32 i64 i128 isize u8 u16 u32 u64 u128 usize }
macro_rules! integer_sum_product {
    (@impls $zero:expr, $one:expr, #[$attr:meta], $($a:ty)*) => ($(
        #[$attr]
        impl Sum for $a {
            fn sum<I: Iterator<Item=Self>>(iter: I) -> Self {
                iter.fold(
                    $zero,
                    #[rustc_inherit_overflow_checks]
                    |a, b| a + b,
                )
            }
        }
  • which ... uses fold() (basically reduce but with an initial value) and plain addition in the anonymous/closure function |a, b| a + b. What!?

Why? How?

  • Ok that was a long way to go to find the addition operator at the bottom of the heap of traits!

  • Hopefully I've grasped the mechanics?!

  • I'm not quite clear on why it's build this way. I'm guessing there's some flexibility baked into the way that the relevant implementation of Sum depends on the element type, which can be flexibly defined as the Item type of an Iterator independently of the type of the collection's elements. That is, an iterator can utilise a type different from the actual elements of a collection and then rely on its particular implementation of sum. And then this can be independent from Add.

  • But that feels like a lot of obscure flexibility for a pretty basic operation, no?

  • For example, this code doesn't compile because a type needs to be specified, presumably type inference gets lost amongst all the generics?

// doesn't compile
let x = vec![1i32, 2, 3].into_iter().sum();

// These do compile
let x2 = vec![1i32, 2, 3].into_iter().sum::<i32>();  // turbofish!!
let x3: i32 = vec![1i32, 2, 3].into_iter().sum();

  • Design choices aside ...
  • I'm still unclear as to how Iterator::sum() works
fn sum<S>(self) -> S
where
    Self: Sized,
    S: Sum<Self::Item>,
{
    Sum::sum(self)
}
  • How does Sum::sum(self) work!?
  • self is the Iterator (so vec![1i32, 2, 3].iter()).
  • And Sum::sum() is the essential trait addressed above.
  • How does rust go from a call of a trait's method to using the actual implementation on the specific type? I guess I hadn't really thought about it, but it makes sense and it's what all those Selfs are for.
  • In this case though, it's rather confusing that the relevant implementation isn't on the type of self, but because of the definition of Sum, the implementation is on the type of the elements (or Item specifically) of self. Sighs

Thoughts??

25
25

A minor but interesting and illuminating point came up in a conversation that I thought was worth sharing, for those learning rust, in a separate post. I'm mostly just copy-and-pasting here.


TL;DR: The patterns you use in match statements and related syntax are (basically) available to you in let statements. This is how destructuring works!! And what they're for with let. But the patterns have to be "irrefutable"


IE, they have to always be able to match the expression/value.


For those who aren't aware, here's the first section in The Book on patterns in let statements.

I think, if this is confusing, there are two points of clarification:

  1. All let statements involve patterns (as Ephera states). They're all let PATTERN = EXPRESSION.
    • For ordinary variable binding, we're just providing a basic pattern that is essentially like a wildcard in that it will match the totality of any expression and so be bound to the full/final value of that expression.
    • It's only when the pattern becomes more complex that the pattern matching part becomes evident, as elements of the value/expression are destructured into those of the pattern.
    • EG, let (x, y, _) = (1, 2, 3); or Ephera's example below let Something(different_thing) = something; which extracts the single field of the struct something into the variable different_thing (handy!).
  2. let statements must use irrefutable patterns. That is, patterns that cannot fail to match the expression.
    • For example, against a tuple, (x, y, _) will always match. Another way of putting it: irrefutable patterns are about destructuring not testing or conditional logic.
    • if let statements on the other hand can take both irrefutable patterns and refutable, but are really intended to be used with refutable patterns as they're intended for conditional logic where the pattern must be able to fail to match the expression/value.
    • See The Book chapter on refutability

The nice and useful example provided by @Ephera@lemmy.ml (in the original comment):

struct Something(DifferentThing);

let something = Something(DifferentThing::new());

let Something(different_thing) = something;
  • Here, the variable something is a struct of type Something which contains one field of type DifferentThing.
  • In the final line, we're extracting that DifferentThing field with a pattern in a let statement.
  • IE, Something(different_thing) is the pattern. And it is irrefutable against all variables of type Something, as they have only one field.
view more: next ›

Learning Rust and Lemmy

231 readers
2 users here now

Welcome

A collaborative space for people to work together on learning Rust, learning about the Lemmy code base, discussing whatever confusions or difficulties we're having in these endeavours, and solving problems, including, hopefully, some contributions back to the Lemmy code base.

Rules TL;DR: Be nice, constructive, and focus on learning and working together on understanding Rust and Lemmy.


Running Projects


Policies and Purposes

  1. This is a place to learn and work together.
  2. Questions and curiosity is welcome and encouraged.
  3. This isn't a technical support community. Those with technical knowledge and experienced aren't obliged to help, though such is very welcome. This is closer to a library of study groups than stackoverflow. Though, forming a repository of useful information would be a good side effect.
  4. This isn't an issue tracker for Lemmy (or Rust) or a place for suggestions. Instead, it's where the nature of an issue, what possible solutions might exist and how they could be or were implemented can be discussed, or, where the means by which a particular suggestion could be implemented is discussed.

See also:

Rules

  1. Lemmy.ml rule 2 applies strongly: "Be respectful, even when disagreeing. Everyone should feel welcome" (see Dessalines's post). This is a constructive space.
  2. Don't demean, intimidate or do anything that isn't constructive and encouraging to anyone trying to learn or understand. People should feel free to ask questions, be curious, and fill their gaps knowledge and understanding.
  3. Posts and comments should be (more or less) within scope (on which see Policies and Purposes above).
  4. See the Lemmy Code of Conduct
  5. Where applicable, rules should be interpreted in light of the Policies and Purposes.

Relevant links and Related Communities


Thumbnail and banner generated by ChatGPT.

founded 4 months ago
MODERATORS