|
|
|
@ -809,7 +809,7 @@ If you use a lifetime annotation in a struct's fields, where else does it need t
|
|
|
|
|
|
|
|
|
|
[[exercises]]
|
|
|
|
|
name = "iterators1"
|
|
|
|
|
path = "exercises/standard_library_types/iterators1.rs"
|
|
|
|
|
path = "exercises/iterators/iterators1.rs"
|
|
|
|
|
mode = "compile"
|
|
|
|
|
hint = """
|
|
|
|
|
Step 1:
|
|
|
|
@ -826,7 +826,7 @@ https://doc.rust-lang.org/std/iter/trait.Iterator.html for some ideas.
|
|
|
|
|
|
|
|
|
|
[[exercises]]
|
|
|
|
|
name = "iterators2"
|
|
|
|
|
path = "exercises/standard_library_types/iterators2.rs"
|
|
|
|
|
path = "exercises/iterators/iterators2.rs"
|
|
|
|
|
mode = "test"
|
|
|
|
|
hint = """
|
|
|
|
|
Step 1
|
|
|
|
@ -847,7 +847,7 @@ and very general. Rust just needs to know the desired type."""
|
|
|
|
|
|
|
|
|
|
[[exercises]]
|
|
|
|
|
name = "iterators3"
|
|
|
|
|
path = "exercises/standard_library_types/iterators3.rs"
|
|
|
|
|
path = "exercises/iterators/iterators3.rs"
|
|
|
|
|
mode = "test"
|
|
|
|
|
hint = """
|
|
|
|
|
The divide function needs to return the correct error when even division is not
|
|
|
|
@ -866,7 +866,7 @@ can make the solution to this exercise infinitely easier."""
|
|
|
|
|
|
|
|
|
|
[[exercises]]
|
|
|
|
|
name = "iterators4"
|
|
|
|
|
path = "exercises/standard_library_types/iterators4.rs"
|
|
|
|
|
path = "exercises/iterators/iterators4.rs"
|
|
|
|
|
mode = "test"
|
|
|
|
|
hint = """
|
|
|
|
|
In an imperative language, you might write a for loop that updates
|
|
|
|
@ -878,7 +878,7 @@ Hint 2: Check out the `fold` and `rfold` methods!"""
|
|
|
|
|
|
|
|
|
|
[[exercises]]
|
|
|
|
|
name = "iterators5"
|
|
|
|
|
path = "exercises/standard_library_types/iterators5.rs"
|
|
|
|
|
path = "exercises/iterators/iterators5.rs"
|
|
|
|
|
mode = "test"
|
|
|
|
|
hint = """
|
|
|
|
|
The documentation for the std::iter::Iterator trait contains numerous methods
|
|
|
|
@ -895,66 +895,6 @@ The fold method can be useful in the count_collection_iterator function.
|
|
|
|
|
For a further challenge, consult the documentation for Iterator to find
|
|
|
|
|
a different method that could make your code more compact than using fold."""
|
|
|
|
|
|
|
|
|
|
[[exercises]]
|
|
|
|
|
name = "box1"
|
|
|
|
|
path = "exercises/standard_library_types/box1.rs"
|
|
|
|
|
mode = "test"
|
|
|
|
|
hint = """
|
|
|
|
|
Step 1
|
|
|
|
|
The compiler's message should help: since we cannot store the value of the actual type
|
|
|
|
|
when working with recursive types, we need to store a reference (pointer) to its value.
|
|
|
|
|
We should, therefore, place our `List` inside a `Box`. More details in the book here:
|
|
|
|
|
https://doc.rust-lang.org/book/ch15-01-box.html#enabling-recursive-types-with-boxes
|
|
|
|
|
|
|
|
|
|
Step 2
|
|
|
|
|
Creating an empty list should be fairly straightforward (hint: peek at the assertions).
|
|
|
|
|
For a non-empty list keep in mind that we want to use our Cons "list builder".
|
|
|
|
|
Although the current list is one of integers (i32), feel free to change the definition
|
|
|
|
|
and try other types!
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
[[exercises]]
|
|
|
|
|
name = "arc1"
|
|
|
|
|
path = "exercises/standard_library_types/arc1.rs"
|
|
|
|
|
mode = "compile"
|
|
|
|
|
hint = """
|
|
|
|
|
Make `shared_numbers` be an `Arc` from the numbers vector. Then, in order
|
|
|
|
|
to avoid creating a copy of `numbers`, you'll need to create `child_numbers`
|
|
|
|
|
inside the loop but still in the main thread.
|
|
|
|
|
|
|
|
|
|
`child_numbers` should be a clone of the Arc of the numbers instead of a
|
|
|
|
|
thread-local copy of the numbers.
|
|
|
|
|
|
|
|
|
|
This is a simple exercise if you understand the underlying concepts, but if this
|
|
|
|
|
is too much of a struggle, consider reading through all of Chapter 16 in the book:
|
|
|
|
|
https://doc.rust-lang.org/stable/book/ch16-00-concurrency.html
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
[[exercises]]
|
|
|
|
|
name = "rc1"
|
|
|
|
|
path = "exercises/standard_library_types/rc1.rs"
|
|
|
|
|
mode = "compile"
|
|
|
|
|
hint = """
|
|
|
|
|
This is a straightforward exercise to use the Rc<T> type. Each Planet has
|
|
|
|
|
ownership of the Sun, and uses Rc::clone() to increment the reference count of the Sun.
|
|
|
|
|
After using drop() to move the Planets out of scope individually, the reference count goes down.
|
|
|
|
|
In the end the sun only has one reference again, to itself. See more at:
|
|
|
|
|
https://doc.rust-lang.org/book/ch15-04-rc.html
|
|
|
|
|
|
|
|
|
|
* Unfortunately Pluto is no longer considered a planet :(
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
[[exercises]]
|
|
|
|
|
name = "cow1"
|
|
|
|
|
path = "exercises/standard_library_types/cow1.rs"
|
|
|
|
|
mode = "compile"
|
|
|
|
|
hint = """
|
|
|
|
|
Since the vector is already owned, the `Cow` type doesn't need to clone it.
|
|
|
|
|
|
|
|
|
|
Checkout https://doc.rust-lang.org/std/borrow/enum.Cow.html for documentation
|
|
|
|
|
on the `Cow` type.
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
# THREADS
|
|
|
|
|
|
|
|
|
|
[[exercises]]
|
|
|
|
@ -1016,6 +956,68 @@ of the original sending end.
|
|
|
|
|
See https://doc.rust-lang.org/book/ch16-02-message-passing.html for more info.
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
# SMART POINTERS
|
|
|
|
|
|
|
|
|
|
[[exercises]]
|
|
|
|
|
name = "box1"
|
|
|
|
|
path = "exercises/smart_pointers/box1.rs"
|
|
|
|
|
mode = "test"
|
|
|
|
|
hint = """
|
|
|
|
|
Step 1
|
|
|
|
|
The compiler's message should help: since we cannot store the value of the actual type
|
|
|
|
|
when working with recursive types, we need to store a reference (pointer) to its value.
|
|
|
|
|
We should, therefore, place our `List` inside a `Box`. More details in the book here:
|
|
|
|
|
https://doc.rust-lang.org/book/ch15-01-box.html#enabling-recursive-types-with-boxes
|
|
|
|
|
|
|
|
|
|
Step 2
|
|
|
|
|
Creating an empty list should be fairly straightforward (hint: peek at the assertions).
|
|
|
|
|
For a non-empty list keep in mind that we want to use our Cons "list builder".
|
|
|
|
|
Although the current list is one of integers (i32), feel free to change the definition
|
|
|
|
|
and try other types!
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
[[exercises]]
|
|
|
|
|
name = "rc1"
|
|
|
|
|
path = "exercises/smart_pointers/rc1.rs"
|
|
|
|
|
mode = "compile"
|
|
|
|
|
hint = """
|
|
|
|
|
This is a straightforward exercise to use the Rc<T> type. Each Planet has
|
|
|
|
|
ownership of the Sun, and uses Rc::clone() to increment the reference count of the Sun.
|
|
|
|
|
After using drop() to move the Planets out of scope individually, the reference count goes down.
|
|
|
|
|
In the end the sun only has one reference again, to itself. See more at:
|
|
|
|
|
https://doc.rust-lang.org/book/ch15-04-rc.html
|
|
|
|
|
|
|
|
|
|
* Unfortunately Pluto is no longer considered a planet :(
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
[[exercises]]
|
|
|
|
|
name = "arc1"
|
|
|
|
|
path = "exercises/smart_pointers/arc1.rs"
|
|
|
|
|
mode = "compile"
|
|
|
|
|
hint = """
|
|
|
|
|
Make `shared_numbers` be an `Arc` from the numbers vector. Then, in order
|
|
|
|
|
to avoid creating a copy of `numbers`, you'll need to create `child_numbers`
|
|
|
|
|
inside the loop but still in the main thread.
|
|
|
|
|
|
|
|
|
|
`child_numbers` should be a clone of the Arc of the numbers instead of a
|
|
|
|
|
thread-local copy of the numbers.
|
|
|
|
|
|
|
|
|
|
This is a simple exercise if you understand the underlying concepts, but if this
|
|
|
|
|
is too much of a struggle, consider reading through all of Chapter 16 in the book:
|
|
|
|
|
https://doc.rust-lang.org/stable/book/ch16-00-concurrency.html
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
[[exercises]]
|
|
|
|
|
name = "cow1"
|
|
|
|
|
path = "exercises/smart_pointers/cow1.rs"
|
|
|
|
|
mode = "compile"
|
|
|
|
|
hint = """
|
|
|
|
|
Since the vector is already owned, the `Cow` type doesn't need to clone it.
|
|
|
|
|
|
|
|
|
|
Checkout https://doc.rust-lang.org/std/borrow/enum.Cow.html for documentation
|
|
|
|
|
on the `Cow` type.
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
# MACROS
|
|
|
|
|
|
|
|
|
|
[[exercises]]
|
|
|
|
|