August 23rd, 2023 × #Rust#JavaScript#Web Development
Rust for JS Devs — Part 2
In part 2 of Rust for JavaScript developers, Scott and Wes dive deeper into Rust's type system, talking about integer types, strings, string slices, arrays, tuples, and other collection types. They also cover defining structs, adding methods, and other fundamentals.
- Rust for JS Devs Part 2
- Audio interface issues in Chromium
- Let keyword for immutable variables
- Mut keyword for mutable variables
- Const variables in Rust
- Debugging Rust apps with Sentry
- Signed and unsigned integer types
- Using the as keyword for type conversions
- Const variables in Rust
- Type inference in Rust
- Statically typed and strongly typed
- Compile-time type checking
- Ownership and borrowing
- Type inference in Rust
- Memory management in Rust
- Pattern matching with Rust types
- Generics in Rust
- Zero-cost abstractions
- Basic types in JavaScript
- Signed vs unsigned integers
- Integer sizes and performance
- Unsigned integer range
- Signed integer ranges
- Choosing integer sizes
- Floating point types
- String types
- Slice references with &str
- Arrays, tuples and vectors
- Option and Result types
- Structs, enums and hashmaps
- Vectors vs arrays
- Memory overhead of hashmaps
- Benefits of Map in JavaScript
- Signed vs unsigned integers
- Type inference with generics
- The as keyword
- Use cases for &str
- When to use &str vs str
- for loops with &str
- Debugging &str issues
- Defining structs in Rust
- Adding methods to Rust structs
- HashMap for dynamic structures
- Sick picks
Transcript
Announcer
You're listening to Syntax, the podcast with the tastiest web development treats out there. Strap yourself in and get ready. Here is Scott Talinski and Wes Boss. Welcome to Syntax,
Wes Bos
the podcast with the tastiest development treats. We've got part 2 to One of the most well received podcasts we've done in quite a while, and that is Rust for JS Devs. People really liked, rid. Scott kinda went through some of the very basics of Rust and explained what they are in relation to a JavaScript developer who knows what those things are. Rid. Now what we're gonna do is to dive into part 2, which is a little bit more of the types and integers and Different types of numbers, strings, the as keyword, you name it. Hello, Scott. How are you doing today? Oh, I'm doing Hey, man. We've been, having so many audio difficulties.
Rust for JS Devs Part 2
Scott Tolinski
I it's the this is for all you We have.
Audio interface issues in Chromium
Scott Tolinski
We have. I have. Sorry.
Scott Tolinski
I have been having so many audio issues, and it's for all you web heads out there, this is Like a a really interesting bug. And and actually, West, just like moments ago, I found somebody on Reddit with the exact same bug with a different audio interface.
Scott Tolinski
So, they did not find any solutions, unfortunately. But did they say all of a sudden, their audio inputs, Like, for their interface has stopped showing up on all Chromium based browsers.
Scott Tolinski
So for me, All of my audio inputs that I have have, you know, it's like some of the default ones work just fine, but anything that's related to my audio interface does not show up In Chrome and all Chromium based browsers, including an older version of Chromium that I downloaded directly, like an older like, a 2020 version of Chromium.
Scott Tolinski
So Yeah. I am very confused As to why that might be, it works in Firefox. It worked in Safari.
Scott Tolinski
No no Chromium based rather. So If you're out there and this this type of bug has resonated with you and you have some insight here, hit us up because I'm I'm trying to figure this one out. All of a sudden, it doesn't work. This person was having a a same issue with a a UAD Apollo interface.
Scott Tolinski
So
Wes Bos
that's the one you you have a u UAD device, so It's interesting that mine is not working. It's very it's definitely something like system level. You know? Like, we've we've sort of pinpointed it to it's not the website. It's not rid Just it's all Chromium based browsers. And, like, the only time I ever have issues with interfaces not showing up is when I have running Zoom. Rid. And Zoom does something to jack the interfaces and lock them.
Let keyword for immutable variables
Wes Bos
And specifically, Google Hangouts does a good job at rid. Detecting that and saying, hey. You're not running anything else, are you? And if you quit Zoom, it will will tell you. But it's it's bizarre, so, hopefully, I can get it pinpointed. Yeah. Rid. It it's so weird that it's only Chromium based browsers in literally every Chromium based browser.
Mut keyword for mutable variables
Scott Tolinski
New profile, old profile, Granted all the permissions, like, you could try everything. So I'm, like, 1 step away from reformatting my computer over this, which rid. Obviously, it would be awful, awful process. Well, Wes, how are you doing today? I'm doing pretty good. Just up at the cottage,
Wes Bos
enjoying all the summer. And I'm working on a deck right now, which is kind of fun. I've never built a deck before, so it's flexing my carpentry skills. Yeah. I've built,
Const variables in Rust
Scott Tolinski
I I built, 1 deck with my dad. My dad has designed a couple of decks. He's like, rid. Maybe even built, like, 3 decks or something. He he built my all of my family's decks, which are auction actually, like, really Intense decks. So when we we had our house in Michigan, I asked him to help me, and he designed our deck, and then we built it together. And then Deck building, it's an intense process, but it's super rewarding. Yeah.
Wes Bos
It's it's wild. It's you look now that I, like when it got into it a little bit, I, like, start rid. Looking at every deck I see and every dock that I see, and I quickly realized that most people are just slapping lumber together, which is rid. Sometimes fine for, like, like, ground decks, but, like, the high ones, you don't want to mess with it. You have to, like, understand, like, how how weight is transferred down to the ground. And It's crazy. Some some of these decks you see is just people are just bolt and stuff together
Scott Tolinski
and hoping for the best. Totally. Yeah. My dad was an engineer, so his His whole thing was better to over engineer it than to under engineer it, and, they were always, like, super sturdy. So syntax is presented by rid. [email protected].
Scott Tolinski
And let's say you're getting rusty and you need to debug your Rust apps.
Debugging Rust apps with Sentry
Scott Tolinski
Well, you can actually do Rust air Tracking and performance monitoring with Sentry. So just like Sentry is awesome for all of the tools that we know and love inside of our JavaScripts and our, everything like that. It works well in so many other things, including, Unity if you're doing game dev or Unreal Engine if you're doing game dev. But it it can debug serverless. It can debug Ruby, Pearl, Python, PHP.
Scott Tolinski
It can do c plus plus rid. Kotlin. No. Kotlin.
Scott Tolinski
Oh, yeah. It can do everything. Honestly, it's not a bad like,
Wes Bos
You know, there's, like, hello world in every language. It's not a bad thing to look at how to set up Sentry in every language because it gives you a nice little end product. In every language. It's yeah. It's kind of it's kind of a nice little hello world. Yeah. It's the same thing in every language. It's beautiful.
Scott Tolinski
There's Cocoa. You can do any of the Apple stuff. Right? You're doing the macOS. What what are you gonna do? Like, a Vision OS app? Maybe you're gonna put 10th century on that bad boy. And that way, you can track error's performance.
Scott Tolinski
You can do so much with this tool. You can dive in and find out exactly what's going wrong, especially if you're just learning Rust. You're bound rid have some errors and mistakes, so check it out at century.i0.
Scott Tolinski
Use the coupon code at tasty treat, all lowercase and all one word, and you will get 2 months for rid. Free. Alright. Let's get Rusty. Alright. Let's get on into
Wes Bos
Rust for JS devs part 2. If you haven't listened to the first one, rid. Maybe a good idea to go give a quick listen to that, but let's start off with variables
Signed and unsigned integer types
Scott Tolinski
in Rust. How do they work? Yeah. So So I think the general vibe of this entire episode is we're gonna be talking about the type system. We're gonna be talking about variables. We're gonna Talking about mutability and mutability and some of, like, the weirder things you you see in in Rust occasionally that might make you confused, like the, rid. Weird ampersand before some types and things like that. So we're just gonna we're gonna take our previous episode, which we talked about mainly some, You know, high level differences between TypeScript and Rust and, basically, how Rust has cargo to do Absolutely everything for you. So this episode will be a little bit more more code based, but we're gonna be talking about the type system and variables and those types of things.
Using the as keyword for type conversions
Scott Tolinski
So in Rust, by default, all variables are immutable, and you typically assign them with let.
Scott Tolinski
Let x equals 5. That means that x is going to be always equal to 5. It is immutable. It cannot be changed.
Scott Tolinski
And this is, like, legit immutable. It's not like JavaScript's const that's, like, kind of just more of a suggestion.
Scott Tolinski
You know?
Wes Bos
Rid. Yeah. It's like JavaScript const is by reference, meaning that when you create a variable and you set it to something like rid Like a number, you can never change that. But if you were to set it to an object or an array, it's never going to change that object or array. But the values inside of those objects array can be modified. So if you do ever want to, like, totally freeze it up, you use The freeze API in JavaScript to to do that. Totally.
Scott Tolinski
So, let x equals 5.
Scott Tolinski
Immutable can't be changed. If you want to define a mutable variable, one that is able to be changed, you have to explicitly state that it's mutable with the mut keyword. So you then say let mute x equals 5. Now x is is now mutable. You can do x, math on x and and change it and whatever you need to do.
Scott Tolinski
There is also, however, const. So you do have let and const, Our good old friends from JavaScript.
Const variables in Rust
Scott Tolinski
Const, however, is something that needs to be defined at compile time. So these are variables that aren't dynamically set.
Scott Tolinski
So you're not setting this as the result of a function. You're setting this to a single value. Right? So these are actual true constants, so to say. These things are set to be a single value, not the return of a function or anything that's that dynamically. Oh, okay. So, like, the the output
Wes Bos
of sorry. A a const must be explicitly set to a string
Scott Tolinski
of and not a string of get name. Correct? Absolutely correct. Yeah. If you and and that's really the difference between let and const considering they're both Immutable by default.
Type inference in Rust
Scott Tolinski
Just that const needs to be essentially like a true constant. Uppercase.
Wes Bos
This Generally something I do in JavaScript is when I upper case my const variables, They're generally like that. They are defined at author time.
Wes Bos
They're never going to change, and they're not dynamic. They're not an output from a value. So That might be something like a const base name, and that's like the base of a URL before I I make a fetch request or rid. Const per page is going to be I guess, per page might change depending on the user. But if it's something that is just a value that I set at the top of my file And go in. I always use uppercase for that. And is that something that has to be done in Rust, or is that just a, a stylistic choice made by most Rust rid. Stations.
Scott Tolinski
Oh, nice. Rustations. He namedroppin'.
Scott Tolinski
Yeah. No. It is, that's actually what they call themselves in case you were wondering. They are rustations. Rid Yes. It is not required. It is a convention. So the all caps underscore naming of things for constants is just a convention.
Scott Tolinski
And it's a convention that I follow in in TypeScript as well, and some people don't. Some people do. I pretty much just use it for true Constants like this. Right? Things that are are defined once.
Scott Tolinski
So, yeah, it it's not required to be that way, but that's Typically, how you see it being written in the real world. So let's get into the type system. So, you know, we have types in TypeScript.
Statically typed and strongly typed
Scott Tolinski
If you're out there and you still haven't used TypeScript, types basically are the way that you say what things are. You know? This is a string. This is a a number. Whatever.
Scott Tolinski
In Rust, however, Rust Rust's type system, if you're coming from the TypeScript world, Feels very familiar. It's very TypeScript as compared to other type systems.
Compile-time type checking
Scott Tolinski
But Unlike TypeScript and JavaScript in general, it is, statically typed and strongly typed. So Your code won't compile if there are type issues, and there's no way around that. You know? Like, in TypeScript, you can just say, Hey.
Scott Tolinski
How about we just compile anyways right now even though the types aren't passing? Yeah.
Scott Tolinski
So this It's basically a system that says all types are checked at compile time.
Scott Tolinski
And just like TypeScript, the main reason is It reduces the potential of runtime errors. It doesn't eliminate runtime errors, but it reduces the potential of runtime errors.
Ownership and borrowing
Scott Tolinski
So statically typed. It's also strongly typed as in the type of every value is strictly enforced.
Scott Tolinski
You can't get around it. You have to if the thing is the thing, it must be the thing at all times.
Scott Tolinski
And if you're converting it to another type of thing, you have to have some sort of rid. Conversion to another type of thing.
Scott Tolinski
And just like TypeScript, there's also type inference.
Type inference in Rust
Scott Tolinski
And Type inference is the ability for the type system to guess or not guess, but know what your type is based on its usage.
Scott Tolinski
So just like TypeScript, you don't have to explicitly type everything all the time because you can infer types Automatically. Yeah. The type inference
Wes Bos
is super powerful in in all languages. I was looking at some code I wrote this morning, And it was probably 20 lines of a fetch.
Wes Bos
And I literally typed one thing and the rest of it was just inferred.
Wes Bos
Rid and that's that's really nice to have because you don't have to go. Like, that's the sort of the downside people think to TypeScript a lot of times. They're like, oh, I don't feel like having to add all this rid of stuff to it.
Scott Tolinski
And especially if your libraries are beautifully typed, a lot of it is just inferred. Yeah. Totally. So it it basically like you say, it allows for Nicely readable and concise code without, you know, sacrificing your types.
Scott Tolinski
Also, there's this concept of ownership and borrowing, which does Come into play in types a little bit where you are going to be, owning the the variable itself or borrowing it. We'll talk quite a bit more about that and how that relates to the type system, but it's basically one of these things you don't have to think about in JavaScript ever is memory management.
Memory management in Rust
Scott Tolinski
And here, because we don't have a garbage collector, you do have to worry about and think about memory management. And, The type system in Rust, it will, yell at you. It will tell you a little bit of what you need to do to figure things out. It's one of those things that Especially when you're coming from JavaScript world, it can feel like you don't know what's going on at first, but it's It's also one of those things that the more you you work with it, the the easier and easier it becomes and the more you understand. So we'll definitely talk quite bit more about ownership because that's a big concept in in Rust.
Pattern matching with Rust types
Scott Tolinski
Likewise, the type system allows for complex pattern matching.
Scott Tolinski
This allows us to do things like really advanced, almost like switch statement type control flows to be able to easily pattern match To, direct our responses and things like that. It also has the, concept of generics. And the way that generics Work in Rust is is really the exact same as they do in TypeScript. So if generics confuse you in TypeScript, they're gonna confuse you in Rust. They are the same, but it's really just a way of saying, Hey. I don't I don't necessarily, this thing might be a string coming into this function. It might be a number coming in this function, but We can pass in that type when we use it and have that type being used directly as the type itself. It's a generic type. Yeah.
Wes Bos
The best way I've ever heard it described or sorry. I don't want to pump my own horse, but I always call them type arguments, rid meaning that like like a function can have an argument.
Generics in Rust
Wes Bos
You you don't you don't make your functions only do one thing. If you want them to be dynamic, Pass in the piece that needs to be dynamic. Right? Same thing with type arguments is if you don't know if it's going to be a string, a number, or a sandwich type, You pass that in when you go ahead and use that. I do love the, horn tooting. I I did once hear a really good podcast about
Scott Tolinski
Rust by this guy, Scott Talinski. It was
Wes Bos
Unreal. Unreal. Amazing.
Scott Tolinski
And there's also Something called zero cost abstractions, which because of the the way the types system works in Rust, there's compile time optimizations to make abstractions Cost nothing.
Scott Tolinski
So let's get into the actual types themselves. These are the things that are interesting in in JavaScript and TypeScript.
Zero-cost abstractions
Scott Tolinski
You know what types of types we have, Wes. Can you name the types in JavaScript?
Wes Bos
String, number, boolean, object, Undefined, null,
Basic types in JavaScript
Scott Tolinski
and symbol? Yeah. I feel like that I feel like that's right. Right? I thought there were 6, but maybe there's not. I mean, there's more than that. Well, 5 I I said 7, didn't I? There's Symbol is the new one. Yeah. Cymbal's the one that people always forget. Okay. So the types inside of Rust are very similar. You have a bool, which is a boolean.
Scott Tolinski
You have a, char, which is a unicode scalar value. You have Signed and unsigned integers. Now this is where it gets a little bit more interesting than in JavaScript. Right? In JavaScript, we just have number. Right? But here we have I 8, I 16, I 32, I 64, and same with u 8, u 16. And and these things are basically The length of your integer, you could think of it as like really small numbers just need an 8 bit integer. Larger numbers need a larger bit integer, rid.
Scott Tolinski
And that's really just it. And so you're able to essentially define the size of the container of the number In the type, so that way you're not using a larger container than the type of number you're ever going to be able to need. Right? You don't need a 64 bit Yeah. Integer if you're only going to be having 1 through 5. You know? Like like, people might be saying like, that's annoying. Like, I don't I don't Don't box me in. I don't know what my variable my integers are going to be. You kind of should.
Signed vs unsigned integers
Wes Bos
But I guess the the benefit of that, I guess, is that it's rid That's why Rust is fast. Right? Because it's in JavaScript, there is a max integer, and it is. You can find it out if you go into your dev tools and say, capital n number dot max max_safe underscore integer.
Wes Bos
And that is how many characters long is that? Let me see.
Wes Bos
Sixteen characters long. That makes sense. Right? So yeah. It's like 9 quadrillion.
Integer sizes and performance
Wes Bos
Basically, it goes super high. And every time you make a number, I'm gonna count from 1 to 2.
Wes Bos
JavaScript is allocating the memory for you to possibly count up to that max safe integer. Right? And that's unnecessary in a lot of cases. So By sort of knowing ahead of time, you get a lot of performance benefits. Right? Absolutely correct. And
Scott Tolinski
and for those of you who are like, well, now I gotta worry about all these different ones, Well, think about it like this. I I would say most of the time, the numbers that you're using are going to fall into one of the, smaller container sizes where you have, like an 8 bit integer is basically anywhere from 0 to 127.
Wes Bos
Oh, I thought it was 255.
Unsigned integer range
Scott Tolinski
It is 127.
Scott Tolinski
So well, okay. I I'm sorry. That is in a signed.
Scott Tolinski
So you you are you are correct.
Scott Tolinski
And this is the whole bit of signed verse unsigned, which we'll talk about because a signed integer Goes from a negative to a positive.
Scott Tolinski
So a signed integer could go from negative 127 to 127, Where an unsigned integer will go from 0 to 255.
Scott Tolinski
Does that make sense? What is this?
Wes Bos
Rid. Yeah.
Wes Bos
But why and what is that for? Why does that exist?
Scott Tolinski
Yes. Here's why that exists. So we have signed and unsigned in. It's so funny. Every time I see the word signed, I always think about, like, a certificate. Right? Like, this is Like a SSL certificate or something. But that's not what this is. This is a like, you could think of it as a straight up number sign. Is it a plus or a minus? Right? So a signed integer includes negative numbers as in it can have a negative sign in front of it. So that's why the range is smaller because the range is negative 127 to 127, wherein Signed means there's no concept of negative, and it's just 0 is the lowest you can go. Oh,
Wes Bos
that makes so much sense. So half of it is used for the sign. Half of it is used for the sign.
Signed integer ranges
Scott Tolinski
So if you're getting into negative territories, Signed integers, 8 bit is 127 to negative 127.
Scott Tolinski
Sixteen bit is negative rid 32,767 to positive 32,767.
Scott Tolinski
So if you're if you're looking at the thing like probably enough. Yeah. What do I need here? It's it ends up being pretty obvious because the only time you ever need a 64 bit integer is if you're getting into Truly massive numbers considering a 32 bit integer is, what, like, 2,000,000,000,000.
Scott Tolinski
So, Typically, you'll probably unless you're doing some really high number calculations, you're probably gonna be using an 8 bit or a 16 bit integer most of the time. And then if you need negatives, it's, signed. If it's unsigned, you get that much more. You get up to, like, what, 64,000 or something. 65,000.
Wes Bos
That's cool. A lot of this seems rid Annoying to us as JavaScript developers, but if you can give it a little bit more foresight, you do get those perf wins. Like, I had the same issue with the rid The Syntax site, we are building with Prisma, and we're using the MySQL adapter. Right? Yes. Rid And if you wanna do something as simple as store an array of strings, it doesn't work. Yeah. It doesn't work. Yeah. Like, you can't rid. Store an array of strings in MySQL.
Choosing integer sizes
Wes Bos
You have to create another table for those things and have a relationship. And rid. I'm sitting there being like, this is such a pain in the butt. Oh, yeah. If I just want a store, Wes comma Scott, and I Wes and Scott will be 2 different entries in a totally different table, and you end up with so many tables. But the flip the like, the benefit to that is that It's going to be fast as hell. Right? And you're sort of doing the work up upfront. Yeah. It is very wild.
Scott Tolinski
But, again, yeah, it's one of those things that we take for granted. And especially when you first get into this, you're like, that's annoying. But it makes so much sense. And, ultimately, when you're writing your code, You do know, hey. This thing I'm I'm tracking days days of the year here. It's it's obviously going to be A a u eight, right, because there's no negative values.
Scott Tolinski
There's less than a 100 and or 250, 255, whatever.
Scott Tolinski
So it ends up being pretty obvious when you're writing your code. It just seems like a lot to know ahead of time when you're thinking about it coming from TypeScript.
Scott Tolinski
Now there's also floating point numbers. There's f 32, a 32 bit floating point, and an f 64, 64 bit floating point. Those are floats Just like in JavaScript, you are decimal based things.
Floating point types
Scott Tolinski
We also have strings which are dynamically sized strings And that's a capital s string. K. So you'll you'll see string as the basic definition of a string everywhere in your code. However, There's also this weird ampersand STR type.
Scott Tolinski
And, this gets into the lovely world of borrowing, but you could think of the, STR is what's called a slice of a string.
String types
Scott Tolinski
And the ampersand oftentimes means that it's a reference.
Scott Tolinski
But an ampersand STR is a slice of a string. So you have an existing string. You take a slice of it. You're gonna be using it at STR. You need to take that string to borrow it to maybe grab a subset of that string, whatever. It's an ampersand s t r. That's what it is. Oh, and,
Wes Bos
rid Like like, let's do we have some more examples of what that might be? Like, let's say we had the transcript from this podcast, which was, rid Like, massive. Right? And I wanted to just show stick, like, the first 2 minutes into another string. Is that where I might use a Slice string? Correct.
Scott Tolinski
Yes.
Scott Tolinski
And and we'll even talk a little bit more about that in a bit when I I have a section called what's up with at Or ampersand STR. So Okay. There's also an array type which is a fixed size contiguous sequence of elements of the same type. Okay? There's a slice, a dynamically sized view into a contiguous sequence of events or events.
Slice references with &str
Scott Tolinski
Contiguous? Yeah.
Wes Bos
Contiguous sharing a common border. Touching. Touching.
Wes Bos
Next to each other or connecting.
Scott Tolinski
Yep. That's nice. There's a a tuple, which is a fixed size ordered collection of elements possibly of different types.
Arrays, tuples and vectors
Scott Tolinski
Rid. So
Wes Bos
2 bold concept that we've kind of seen around, there's a proposal to add 2ples to JavaScript in the same sort of way. Yeah. That's one of those, like, rid. Gary wants in JavaScript where you hear the word, you know, like, oh my gosh. What the heck is a tuple? But at the end of the day, it's just an array rid where you know how many items are in the array and you know the type of each of those items. So if you have like like, A spreadsheet is probably the most common example. If you have an array a a row in a spreadsheet where you have an ID, a name, and a is cool, That would be a number, a string, and a bullion. And, you know, you know ahead of time that those items are going to be in the ray and, you know, the types of them. Yeah. And it's kind of like, I mean, rid It doesn't,
Scott Tolinski
hooks, don't they return a tuple oftentimes
Wes Bos
or, like, the good state? Yeah. Yeah. Hook is a tuple because, like, it always returns to you.
Wes Bos
Rid. And the first thing is going to be a specific type of your state, and the second thing is going to be a function that, accepts A specific type. Yeah. So, yeah, that is, like, a really good example of a 2 pole. Yes. It is.
Scott Tolinski
There's also something called an option, which Represents an optional value that could be some value or none.
Scott Tolinski
There's a result which is the result of an operation, and result rid. Is one of the cooler ones because, it it allows the control flow to be really nice because the result can either be o okay or error. And if it's okay, it it allows us for really easy error checking. And if you come from the world of JavaScript using async await and checking, rid. Error exhaustive states with catch and all that stuff.
Option and Result types
Wes Bos
The whole result business is gonna feel like a dream to you. Sorry. I'll rid I'll just say I just wrote some notes this morning on how to do that in JavaScript, because I just recorded a video for my TypeScript course.
Wes Bos
And the next show we're recording after this, I'm going to talk about it, how to use it with Fetch. Nice. Yeah. That's awesome. And, we'll even have an example. Rid. Talk more about air handling,
Scott Tolinski
later on in this series. I have a so many notes for this stuff that, what we're gonna do is we're gonna just see how far we can get each episode, and And we're gonna chop it off at that point and pick it up because I could just keep going on this stuff. Yeah. We'll make a playlist for for all these as well. The new site, as well as a Spotify playlist For each of these so you can go and just listen to them all in one go. Yeah, buddy. Yeah. That's a good idea for the site. We have an added playlist. We should get we gotta do that. That's easy. Okay. Alright. Next up is, which are typically what you'd have. It's a a type that represents a value that can be One of several alternatives you could think of it, Enum, as being kind of like an object that has very explicit value values to it.
Structs, enums and hashmaps
Scott Tolinski
Rid. The values don't change. Right? Then you also have a struct. Okay? Now struct is probably the closest thing to a JavaScript object. Rid. Right? It's a custom data type that groups together multiple fields of different types. You can have methods in there, although they They don't get defined into the struct as you do in in JavaScript, but you can have as many as many things as you want in a struct. It is very object Like inside of JavaScript.
Scott Tolinski
You also have a Vec, which is a dynamically sigh resizable heap allocated vector or array.
Vectors vs arrays
Scott Tolinski
So something to note here is that an array as defined is a fixed size, right, where a vector is dynamically resizable.
Scott Tolinski
So you could think of it as like an array that what we have in JavaScript where you can add, remove things, whatever. So
Wes Bos
we have array, A fixed size of the same type.
Wes Bos
So I might have 10 numbers.
Wes Bos
We have a tuple, which is could be mixed types And explicitly known the length.
Wes Bos
And you have a VEC or vector where that is a list of things That can be expanded or contracted.
Wes Bos
So you probably would want a vector in Most cases. Is that right? I I personally end up using a vector way more than
Scott Tolinski
the other 2 options.
Wes Bos
But Yeah. I'm not like a a pro Rust app or something. Do you know the length of your array ahead of time? Right. I find myself
Scott Tolinski
In practice using VEC and seeing it being used more option in in in libraries and stuff. So, Yeah. Definitely 1 you'll encounter a lot. And then there's a hash map, which is a collection of key value pairs implemented in a hash table and a hash set, Which is a collection of unique values implemented as a HashSet. So you could think of these as sets and maps in JavaScript.
Wes Bos
And that rid What are the keys of a HashMap? What can the keys be? They can be anything? Can they be any type? Or can they just be strings? Because that's one of the nice things about a map in JavaScript is that the key of the map can be an object. Rid. So if you you like, the key of of your map could be a div. And if you wanted to count how many times that div had been clicked, You don't have to, like, give a unique identifier to that div. You just literally use the div itself as the key.
Memory overhead of hashmaps
Scott Tolinski
Is that the same in Rust? Yeah. Hash map. The the types you can have for a hash map, you can use any of the numeric types. You can use the string types. You can use, enums rid Or or custom types. You could define a type and have those be the the key of a hash map.
Wes Bos
Beautiful. Yeah. It's it's funny because, like, most Languages have this, right? Even Ruby has a hash, and we only ever had objects in JavaScript. And now that we have maps, I find myself often forgetting to actually use a map, and I just go for an object, but
Scott Tolinski
rid. Maps are great, man. I almost never use a map. Do they give performance, benefits by using a map?
Wes Bos
I don't I don't know if it's performance benefits, but the API for working with a map is really nice because it has has, rid. And you can reference something by its value.
Benefits of Map in JavaScript
Wes Bos
So again, like, if you wanted to use an object, let's say we had Scott and me, and we were users. Right? And you wanted to, sort the podcast by who started them rid And you by user. Right? Instead of just using, like, a user ID as the key, you could literally use the user object or the user type as the key in the map. Rid. And then you can say, alright.
Wes Bos
If I wanna get all the shows where Scott started it, I would just say shows dot get and pass in Scott. Yeah. According to this, it does say that they do have higher memory overhead and slightly slower performance. But I I I think in the right situations, that's the rid The ticket. Yeah. I guess it depend depends on what you're doing. Right? Like, if it's if you're looping over 10,000,000 things. Like, I I tweeted out about reduce the other day, and a lot of people were like, use a 4 loop. It's much faster.
Wes Bos
Yeah. I'm looking over 3 things, your brother. Like, it doesn't
Scott Tolinski
Those are the type of micro optimizations that drive me nuts. As a YouTuber, the amount of times that people would be like, rid. You should you should be doing this since it's like you're working with 4 items here. It's not gonna make a difference.
Wes Bos
Rid. We're doing 99 bottles of beer on the wall here, you know, like like doing stock market rid. Nanoseconds.
Wes Bos
Serving or anything that needs to be lightning quag. Yeah. And if you're doing if you're literally doing something that is so big, Then maybe you need to
Scott Tolinski
say, like, should this be this be done at a database level? You know? Yeah. Where could this be done? That, Yeah. That is not where I'm doing it in just straight JavaScript.
Scott Tolinski
Okay. So let's talk about, you know, one of the things we talked about was the signed and unsigned thing where we had our signed and unsigned. Yeah.
Scott Tolinski
But you might have been asking yourself, hey, I have an unsigned value and I would like it to be a signed value.
Signed vs unsigned integers
Scott Tolinski
How does that how do I convert it to be assigned value down the road if I decide all of a sudden that I do want negative values? Well, You get to use the as keyword. So just like in TypeScript, we have the as keyword and the as Keyword is really similar in Rust as it is to TypeScript. However, it can do one thing that the as keyword can't do in TypeScript.
Scott Tolinski
It can actually convert your value, in some cases.
Scott Tolinski
So if you have an unsigned variable and you want That variable to now become a signed variable. You don't use a method or a function or anything like that. You use as.
Scott Tolinski
So you could say my Unsigned variable is now as an I eight instead and it will both do type Casting just like it does in TypeScript, but it actually will convert it to be a signed number as well.
Scott Tolinski
So it does typecasting just like it does inside of TypeScript, but it also does conversion of numeric types. It can convert numeric types. Yeah. It can convert enums, and it can convert Boolean and char types.
Scott Tolinski
So it can't do all type conversions. You can't do, You know, turn a number into a string or something with the as keyword, but you can convert number types from one number type to another using the as keyword. What about if you're writing a function in Rust
Wes Bos
rid.
Wes Bos
And you say, alright. Pass me a number, but I don't care what type of number you are passing in.
Wes Bos
Is there, rid. A, is that something you might do or should you be as rigid as possible with your types? Or is there like Is there, like, a generic any number
Scott Tolinski
that you can pass in? I think at that point, you would use a generic, not like a generic any number Because You would say you would know when you're calling that function what the type of integer you're working with is. Oh, yeah. Right. Oh, you could infer it as well. Yeah. Oh.
Wes Bos
Oh, okay. I just I just asked chat gpt, rid. How do I make I, like, ask her for a function. It's like, here's I thirty two. But I was like, well, what if I don't know if it's an I thirty two? And then it says, use a generic. And it shows an example of passing it. And that's good because, like, one thing I think a lot of people don't know in TypeScript land is that rid. Generics can be inferred by the type being passed in, and you don't have to rid. Say, alright. Well, I'm passing it to I 32, so now I have to type I 32.
Type inference with generics
Wes Bos
That can be inferred. Yeah. Totally.
Scott Tolinski
And and and in those aspects, it does feel a lot like TypeScript. Ripped. You know? And that's one of the benefits to working in Rust is that while it it feels like TypeScript on hard mode is really what it feels It still feels like TypeScript in a way that many other things don't.
Scott Tolinski
Okay. So Yeah. That's the as keyword.
The as keyword
Scott Tolinski
Let's talk about this whole string slice business. Like, what's up with the ampersand stuff? So the ampersand stuff, Which ends up getting to be probably enough to fill the rest of this episode with. It it's that in in a big of a topic here is basically Ampersand s t r, as we mentioned, is a string slice. The ampersand symbol is used in conjunction with the s t rid. Type to represent a string slice or what's a reference to another existing string.
Scott Tolinski
So in Rust, You're always either, referencing something or owning something or borrowing something, whatever.
Scott Tolinski
A it's a borrowed reference to a sequence of characters. You're borrowing essentially a group of characters from another string.
Scott Tolinski
And that's important because it means that because you're borrowing a group of strings rid. Or you're borrowing a sequence of characters.
Scott Tolinski
That means you're not able to mutate that sequence because you're just borrowing it. You can't change it. You're just borrowing it. You're saying, I was trying to think of, like, a really good Metaphor for this. And I was trying to think of, like, oh, you when you do, like, a screenshot and you select text and you are able to pull that text, you're just borrowing it from the main text. You're not able to change the main text. You're not able to change the new text. You're just borrowing it.
Wes Bos
Does that make sense? Yeah. I think so. I'm just rid. I'm trying to understand, like like, what might be another example of why you would want rid Ampersand string.
Use cases for &str
Wes Bos
I I guess, like so your initial string is always oh, I think I think I understand. So if you have a function that takes in, like, a search term and you're You're passing in like a sentence and a word you're looking for.
Wes Bos
That function would accept not straight up strings but rid. Ampersand strings because you're passing in
Scott Tolinski
an existing string or part of an existing string. Is that right? Yeah. That's my understanding of it. And this is one of those ones that you'll fight a little bit when you're first getting started because you're so used to just everything. Oh, I'll just make a new string or I'll pass this thing. It's Type of string or whatever. I'm not borrowing it. I'm not whatever.
Scott Tolinski
And there there's definitely some caveats here because the way we're talking about this is right now as as as it is, like, Hey. We're just as a slice of a string. We're not changing, or we're not everything.
Scott Tolinski
This is basically for efficient memory usage. It's not having to create a new thing. It's just saying, Hey. I'm I'm just temporarily holding on to this thing. And even and then I'm not holding on to it. I'm it's almost like I'm just, like, I'm just taking it for a second, and then you can have it back.
Scott Tolinski
So, therefore, when I Oh, if I borrow if I borrow a video game for you and then I, you know, I can play that video game, whatever, I can't. If I destroy it, you're going to be really angry with me. So I have to give that video game back in perfect
Wes Bos
condition. Oh, I see. I see. That makes sense because, like, Like, maybe another example would be if you have the person that copy pastes everything, you know, and now I have this Text in 2 different places.
Wes Bos
So, like, Rust is not making a brand new string every single time. Use ampersand string. It's just referencing the original one, and you're not copy pasting. You're not taking up memory, and that's the
Scott Tolinski
rid. Benefit. Again again, it's a little bit harder, but you get the major memory and and performance improvements because of it. Alright. I think I understand that now. It's an interesting thing. And, again, not something we ever have to think about too much. But, again, it's here for memory usage. Right? We don't have to create something new. You're just borrowing it. So When do you use the at STR? When you only need to read the string data, when you're working with borrowed data or string literals, When the string won't be modified or when you want to avoid unnecessary memory allocation or copying. Okay? Again, performance based.
Scott Tolinski
When you need a string instead of a string slice is when you need ownership. If the string needs to be mutable or dynamically modified, If you want to concatenate or manipulate strings with dynamic changes, you need a normal string type or you want to take Ownership of the borrowed data and modify it. You need the normal string type. Beautiful. So if it's being changed or whatever, it's an existing or non existing thing. You need the add string type. And this kind of the ampersand kind of is almost always used in this way where you're taking a borrowing of something. Right? So the ampersand sign, when you see it being used in in Rust, it's oftentimes being used to take Or to borrow without taking on our ship.
When to use &str vs str
Scott Tolinski
It's often immutable.
Scott Tolinski
It doesn't mean it's always Immutable.
Scott Tolinski
It means it's often immutable. Sometimes there's what's called a a mutable reference, which we'll talk a little bit about that. But, rid. You can have a value, which is as let mute value is equal to 42. Right? You're just setting a mutable variable to the number of 42.
Scott Tolinski
And then you want to have a mutable reference of it. You can use this fancy keyword at m u And then the value.
Scott Tolinski
And then that creates essentially a reference of the value that can be changed.
Scott Tolinski
So, that gets into, like, really more intense borrowing and really more intense referencing of stuff. You can also use it for pattern matching or looping. Right? You can say 4 ampersand item in ampersand.
Scott Tolinski
So if you were doing, like, I want to temporarily borrow essentially this data while doing a for in.
Scott Tolinski
I want to Temporarily borrow it like you see in a, like, a front end template. Right? Each thing has thing.
Scott Tolinski
I think that's that's how you do it in a lot of templating. I'm trying to think of, like, a, react way of doing it. But for ampersand item in ampersand fact is basically temporarily borrowing this value to loop over it.
Scott Tolinski
Okay. You can also do it for ownership transfer or function returns, where if you have an ampersand t, you know, your generic t indicates that a function Returns an immutable reference to the type of tea.
for loops with &str
Scott Tolinski
So if you are out there and you're thinking, oh, yeah. I got this Rust stuff. Right? The the moment you hit Yeah. The ampersand symbol and the whole mutable references part of all of this is the part where you start to feel like, Wait a second. Maybe I don't I don't got this stuff because this is where it really gets Oh, man. It gets annoying.
Scott Tolinski
And it's a type of thing that gets annoying when you're writing the code. Because if you don't know why you're writing and what you're writing, you can almost feel like you're just, like, tossing in ampersands and, Ampersand string or ampersand mute, to try to save your bacon here, essentially. Yeah. I was
Debugging &str issues
Wes Bos
rid Wondering, I looked it up quickly, is, like, is there a tool that will tell you when you're possibly doing something you shouldn't be doing? Rid and maybe we'll have a whole show on on Rust tooling, but it looks like there's this thing called Rust Clippy, which will sort of yell at you. And That's one thing I really liked when I was learning TypeScript is I had a very aggressive, ESLint on TypeScript ESLint. And then every time I hit something, I would go re Research it, and it says, alright. This is probably not a good idea because x, y, and z. Yeah. And you know what? The error messages in Rust
Scott Tolinski
are really good. So in the language tools, if you're just you know, you get the just like in TypeScript, you get the little red squiggly, and you get the same type of error. But if you're comparing it at the TypeScript rid. Errors, which can often feel like a giant tree of madness. Like, you're looking at the TypeScript error, and you say, oh, boy. I don't know about any of this stuff.
Scott Tolinski
In in Rust, it typically it's it's way easier to read, and it it the English in it's pretty good in terms of, like, actually being able to understand it. But I've also found that if I'm Copying and pasting an error into, say, chat g p t. I can you kinda gotta know what you're doing a little bit. But if you copy and paste the error with your code snippet and you say this code is giving me this error in the chat g b t, 9 times out of 10, it's going to say, Yeah. You're this needs to be a string slice, and you're like, oh, okay. I got it. This needs to be a string slice, and that can get you through some of those humps. Because rid. Really, the pain in learning Rust is when you hit a dead end, your code won't work, and you can stop at that dead end And you can choose to power through it or unlike in TypeScript where you can say, oh, let me just throw an any any on here or make TypeScript group happy and move along, whatever.
Scott Tolinski
You're kinda stuck until you figure out exactly what it wants. Right? That could be a pain. So I I have a whole section here on mutable references, but since those are, like, really kind of a annoying concept, let's talk about a struct before we finish rid this off this episode, and we can handle immutable references on, like, a higher level episode. Okay? Because immutable reference stuff is is really not that much fun, especially when you're first learning. So a struct It's going to feel familiar to those of you who work in JavaScript because it is really the closest thing to a JavaScript object Where you define a struct, and the way it works is you first define struct as a type. You say struct, the type name, per brackets, and then you Say what's inside of the structure the structure.
Scott Tolinski
It has a username that's a string. It has an email that's a string. It has a, is active, and that's a Boolean. Right? And then in JavaScript, typically, what you do is you create the object. Right? And it's you create the object instance. And in Rust, you do that the same way you would By putting something into a variable, let user 1 is equal to, and then you say the user this is actually where it differs a little bit because you have to use that type here. You'd say is equal to Mhmm. And then you have the type name and then brackets.
Defining structs in Rust
Scott Tolinski
And then from there, you could put the values in just like you normally Would.
Scott Tolinski
Now here comes the fun part. If we wanted to have methods or methods inside of this object. In JavaScript, You just toss that bad boy as a parameter in your object.
Scott Tolinski
But in Rust, you use this imp imple keyword where, like, implement. Rid. Yeah. Simple.
Scott Tolinski
Yeah. And so after you have defined your struct, you the Struct name. So emple user then brackets.
Scott Tolinski
And then you write a function, f n login, and then you have just like a normal function. From there, you can then use, you know, user.one.login just like you would a normal method. So
Wes Bos
In in TypeScript defining are types, a function is just another type. Right? Like, rid It it inputs and outputs values.
Wes Bos
With Rust, you define your struct, your type. Rid And then to be able to add methods onto that type, it's using the impl. So it's something separate that sort of comes after it. So It's kinda like the data and the logic of a struct or a a piece of data are Defined separately. Yeah.
Adding methods to Rust structs
Scott Tolinski
Yeah. So it's interesting that you have to do it that way, but that's just that's just how you do it. So, Oh, so what are the difference between a struct and an object in JavaScript or beyond, you know, the fact that how you define methods? A struct in Rust has to be a fixed structure that's determined when it's defined. Meaning, you cannot rid. Add or remove fields from a structure dynamically.
Scott Tolinski
So you have to know what the structure of the object is.
Scott Tolinski
You can't add or remove fields from it.
Scott Tolinski
If you wanna have a thing that you can add or remove fields from, that's when you use a HashMap. A HashMap Dynamic key value pair.
HashMap for dynamic structures
Scott Tolinski
Struct is for, like, very structured data. Awesome. Yeah. So I think that we can leave it off there. Yeah. There's a lot of stuff. Yeah. A lot of variables and who knows what, but I hope you feel a little bit more confident getting into, especially, you know, like the signed and unsigned integer stuff, the string stuff. Those are the things that you use all the time. And if you think about the types of variables that we use inside of JavaScript, it's like objects, strings, numbers, booleans, arrays.
Scott Tolinski
You know, it's it's no different except in Rust. You end up using Vect. You end up using struct, float, unsigned and signed integers, Strings and string slices more than anything, and enums and tuples and stuff. But, you know, the the ones that you use most frequently are are really Kind of the same. Awesome. Let's get into some
Sick picks
Wes Bos
sick picks.
Wes Bos
Boy, do I have a sick pick for you today.
Wes Bos
Rid this is a phone mount that I've been using in the gym. So a while ago, I sick picked the Halo Lock, ESR Halo Lock for the car that, like, charges it and docks your phone.
Wes Bos
And that's been working great in the car. But in the gym, rid. I also wanted something where I could sort of bring my phone around to the different parts of the gym and be able to mount it.
Wes Bos
So I found this thing called the Or 0, magnetic phone mount holder. So what it is rid Is it obviously magnets to the back of your phone, and and it has a like a ball bearing swivel on it so you can spin it in any direction. But the other side of it has rid a magnet on it. So you can stick it anywhere that is magnetic. Right? So if you have a rack in your gym, You can stick it anywhere on the rack, which I find really helpful if you're trying to, like, watch a video and figure out form and all that.
Wes Bos
Rid. But then it also comes with these little, like, discs that you can put kind of like the WyzeCam. It comes with these little discs.
Wes Bos
Rid So I put, like, a disc on the treadmill. I put a disc on kind of like the stretching area.
Wes Bos
And it's great because you could just bring your phone around rid And slap this little magnet thing on it and then be able to tilt it in any direction. And I haven't mounted anything anywhere in the gym other than this just little sticky 3 M adhesive tape to it. So I was like, this is such a good option because rid. It doesn't I don't have to change my phone case. Yeah. I don't have to change the fact that it's MagSafe charging or any of that. I just have to rid. Stick this thing wherever I want, and I can just grab it and move it. I only have to have 1 for the entire gym, and I can bring it with me wherever I want. That's it. Yeah. I Yeah. Yeah. I I just use the pop socket, and that would be great if that was magnetic. You could just magnet to anything like that. Oh, yeah. You had Do you you still use the pop? Didn't you buy the that, like, charger that does everything?
Scott Tolinski
I did. Yeah.
Scott Tolinski
So the pop socket for me The pop socket comes off. Yeah. It's just a magnet wallet, and then I I magnet on the thing. Yeah. But the next Step for me is there I think there's one that is like a well, it doesn't do charging through your wallet, so that would be a problem. So I'm gonna have to take it off no matter what either way. So I guess rid. I'm I'm fine with this.
Scott Tolinski
My sick pick is going to be a ThermoCell Patio Shield, which is a mosquito thing. So, You know, we never have mosquitoes in Colorado. It's like I since moving here, I had seen, like, 5 mosquitoes total, But this year has been like monsoon crazy. We just been getting rain every single day in an unbelievable may way and we got mosquitoes somehow. It's like Actual mosquitoes here.
Scott Tolinski
So we've been hanging out outside a lot, and we got this little thermostat patio shield, which it's $18 for the thing.
Scott Tolinski
Rid. But you end up having to buy little fuel cells and stuff. So, yeah, you think $18, but it ends up probably being a little bit We're closer to 30 or something after you you get it all all the little pieces for it. And what it is is it's a battery free Little cylinder that you turn and you put a little looks like one of those, breath strips. You put one of the breath rid. In there. Not a real breath strip, but one of the ones they give you. And it just keeps mosquitoes away for, you know, 12 hours or so.
Scott Tolinski
And I gotta say, I get bitten more than anybody I know, and I I you turn this thing on, and I I don't see a single mosquito. You don't have to cover yourself in bug spray.
Scott Tolinski
It works better, I think, than, like, a citronella candle or something like that.
Scott Tolinski
So I found this to be actually very effective, And I was surprised because when you look at it, you're like, I don't know if this thing's gonna work. Might as well just try it for $20, whatever.
Scott Tolinski
But I found it to be very effective at keeping Mosquitoes away, especially if we're, like, hanging out by the fire pit and just, like, you know, nobody wants to be swatting mosquitoes away while while you're hanging out in the fire pit making s'mores or something.
Scott Tolinski
So
Wes Bos
rid There is, there's a hack you can do to refill those.
Wes Bos
Like, there's a bunch of YouTube videos where guys will rid. Use pliers to pull it off. It's the same thing with, like, the Swiffer.
Wes Bos
You know, like, the Swiffer has that, like So you've heard of this thermostat thing? Oh, yeah. Yeah. Yeah. I've every time I see something like this, I'm like, rid. Someone's gotta figure out how to because, like, anytime I see, like, a product that's, like, cheap, but then they, like, screw you on, like, the refills, and they try to, like, set you up with the, We'll mail you 1 every month.
Wes Bos
I'm I'm always like, somebody's probably figured out how to figure like, because it's just butane in there. Right? Like, that stuff's cheap. Rid. So you should be able to figure out that. I've looked into it because, like, we've got we get not so much right now, but at the beginning of summer, there's a lot of mosquitoes, and You have to douse yourself in deep every every night you go to the fire. I don't love that.
Scott Tolinski
I don't know. I'm I'm weird about that kind of stuff. So, yeah, I'll I'll take the, I'll take the thermostat. It works really well. Did you know, like, there's a lot of, like, little things like that where you can buy generic versions of fancy things. Obviously, you know this. But, like, I found recently you can get Mhmm. A pack of 50 Magic Eraser sponges for, like, $14.
Wes Bos
It's true because it's Somebody those magic erasers, somebody just figured out that this, like, mildly abrasive, fobian material is good at cleaning.
Wes Bos
And I love I love stuff like that where somebody figures out, it doesn't need to be. Yeah. Doesn't need to be something crazy fancy. Yeah. Although I did figure out, That, you know, that spray and wash that you picked a while ago, the power wash, Dawn Powerwash? Yeah. Rid. Yep. I I said, oh, it's just, alcohol and Alcohol and Dawn Soap. It's not. It's it's so much better than that. Like, we've I've I'm not one to, like, buy Expensive things like that, but that stuff is awesome. And you can't it's not replicated. It's not just Dawn and and alcohol. It's it's they've rid. They formulated something something else there. It works really well. I like it still. I'm still using it. It's really good.
Wes Bos
Sick. Jim's plugs, rid. Westboss.com/courses.
Wes Bos
Check it on out if you wanna learn a thing or two about JavaScript.
Wes Bos
Alright. That's it for today. Thanks, everybody, for tuning in. We will catch you later. Peace. Peace.
Scott Tolinski
Head on over to syntax.fm for a full archive of all of our shows.
Scott Tolinski
And don't forget to subscribe in your podcast player or drop a review if you like this show.