Skip to content

Commit 6574800

Browse files
committed
Light text edit
1 parent 9d47c49 commit 6574800

File tree

1 file changed

+19
-16
lines changed

1 file changed

+19
-16
lines changed

05_vectors_and_result_enum.md

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,14 @@ fn read_version(transaction_hex: &str) -> u32 {
1010

1111
There are two different ways we can approach this:
1212
1. Read the first 4 pairs of characters and do some base math to determine the u32 integer.
13-
2. Convert the transaction into a collection bytes first and then just work with the methods available for that type.
13+
2. Convert the transaction into a collection of bytes first and then work with the methods available for that type.
1414

1515
Now that we have a basic understanding of hexadecimal format and bytes, we're going to take approach #2 and leverage an external library.
16-
It will be easier and more efficient to work with an array of `u8` integers to traverse the byte data, rather than read from a string and do unnecessary math.
16+
It will be easier and more efficient to work with an array of `u8` integers to traverse the byte sequence, rather than read from a string and do unnecessary math.
1717
The library can handle the conversion for us.
1818
It will also be easier to work with as we decode the rest of the transaction.
1919

20-
So the first thing we want to do is convert our hexadecimal string into a collection of bytes.
20+
The first thing we want to do is convert our hexadecimal string into a collection of bytes.
2121
We'll use the popular [`hex` crate](https://docs.rs/hex/latest/hex/).
2222

2323
Let's add a dependency to our `Cargo.toml` file.
@@ -50,17 +50,16 @@ fn read_version(transaction_hex: &str) -> u32 {
5050

5151
We'll keep returning `1` at the bottom of the function for now so the compiler doesn't complain a `u32` wasn't returned.
5252
*Note: Rust will simply return the last expression without a semi-colon so the `return` keyword is not needed.*
53-
5453
Let's run this now and see what happens.
55-
Run `$ cargo run` from the terminal.
54+
Execute `$ cargo run` from the terminal.
5655

5756
So far, so good.
5857
That should compile fine.
5958
Let's now get the first 4 bytes from the returned collection.
6059
The returned data is a `vec` - short for Vector - which is something like a `list` in Python or an array in javascript.
6160
Of course, it's more nuanced in Rust.
6261
We'll dive deeper into some of the differences in the next few lessons.
63-
But with a `vec` we can grab the first 4 items doing something like `vec[0..4]` where `0..4` represents a range from 0 to 4, not including 4.
62+
With a `vec` we can grab the first 4 items by doing something like `vec[0..4]` where `0..4` represents a range from 0 to 4, not including 4.
6463
This might be a pattern you're already familiar with.
6564

6665
So let's add that line.
@@ -74,10 +73,12 @@ fn read_version(transaction_hex: &str) -> u32 {
7473
}
7574
```
7675

77-
What happens when we run `$ cargo run`?
76+
What happens when we execute `$ cargo run`?
77+
7878
Well, we get an error.
7979
Take some time to read through it.
8080
You should see something like the following:
81+
8182
```console
8283
error[E0608]: cannot index into a value of type `Result<Vec<u8>, FromHexError>`
8384
```
@@ -87,22 +88,21 @@ Let's examine what `hex::decode` returns.
8788
Remember, we want to work with a Vector of bytes so a `vec<u8>` is the data type we're looking for.
8889
However, if we look at the return type of the `decode` function we see that the data structure we want is wrapped *inside* of a `Result` type.
8990

90-
9191
The `Result` type is a common `enum` that you will see in Rust code.
92-
Enums are a way to describe a mutually exclusive set of options for a particular variable.
93-
If you think about it, it's possible that the `hex::decode` function fails to return a proper collection of bytes.
92+
Enums are a way to describe a mutually exclusive set of values for a particular variable.
93+
If you think about it, the `hex::decode` function can fail to return a proper collection of bytes.
9494
For example, what if one of the characters is not a hex character?
9595
So we get two possibilities from a `Result`, an `Ok` response or an `Err` response.
96+
The former represents a successful computation whereas the latter indicates an error occurred.
9697

97-
So how should we work with this?
9898
There are a few different ways to work with an enum.
99-
We'll explore different ways of handling a `Result` later on in this course, but for now we'll use the `unwrap` method.
10099
Every `Result` enum has an [`unwrap`](https://doc.rust-lang.org/std/result/enum.Result.html#method.unwrap) method that you can call.
101100
This will return the underlying data type if the result is an `Ok` type or it will `panic` and the program will crash if the result is an `Err` type.
102101
Crashing your program is probably not the best way to handle an error, unless you're confident that an `Err` result *should* not be possible.
103-
But we'll look into better ways of error handling later on.
102+
For now we'll use the `unwrap` method.
103+
We'll explore different ways of handling a `Result` and doing proper error handling later on in this course.
104104

105-
For now, let's update this so that we are actually working with the underlying vector of bytes and not the wrapped `Result` type:
105+
For now, let's our function so that we are actually working with the underlying vector of bytes and not the wrapped `Result` type:
106106

107107
```rust
108108
fn read_version(transaction_hex: &str) -> u32 {
@@ -117,10 +117,13 @@ How does the program run now?
117117
Let's see by running `cargo run`.
118118

119119
We're going to get another compile error and it's going to be a confusing one:
120-
`error[E0277]: the size for values of type [u8] cannot be known at compilation time`
120+
121+
```console
122+
error[E0277]: the size for values of type [u8] cannot be known at compilation time
123+
```
121124

122125
This will make more sense as we develop a better understanding of the difference between arrays, slices and vectors in Rust as well as the difference between the stack and the heap.
123-
We'll get a better handle on these concepts as we continue on in the course, but let's get a brief overview of these concepts in the next lesson.
126+
Let's get a brief overview of these concepts in the next lesson.
124127

125128
### Quiz
126129
*Notice the last line of this function.

0 commit comments

Comments
 (0)