Skip to content

Commit

Permalink
feat: Add box1.rs exercise
Browse files Browse the repository at this point in the history
  • Loading branch information
AlexandruGG committed May 26, 2020
1 parent 06ef4cc commit 7479a47
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 0 deletions.
2 changes: 2 additions & 0 deletions exercises/standard_library_types/README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
For the Box exercise check out the chapter [Using Box to Point to Data on the Heap](https://doc.rust-lang.org/book/ch15-01-box.html).

For the Arc exercise check out the chapter [Shared-State Concurrency](https://doc.rust-lang.org/book/ch16-03-shared-state.html) of the Rust Book.

For the Iterator exercise check out the chapters [Iterator](https://doc.rust-lang.org/book/ch13-02-iterators.html) of the Rust Book and the [Iterator documentation](https://doc.rust-lang.org/stable/std/iter/).
Expand Down
35 changes: 35 additions & 0 deletions exercises/standard_library_types/box1.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
// box1.rs
//
// At compile time, Rust needs to know how much space a type takes up. This becomes problematic
// for recursive types, where a value can have as part of itself another value of the same type.
// To get around the issue, we can use a `Box` - a smart pointer used to store data on the heap,
// which also allows us to wrap a recursive type.
//
// The recursive type we're implementing in this exercise is the `cons list` - a data structure
// frequently found in functional programming languages. Each item in a cons list contains two
// elements: the value of the current item and the next item. The last item is a value called `Nil`.
//
// Step 1: use a `Box` in the enum definition to make the code compile
// Step 2: create both empty and non-empty cons lists of by replacing `unimplemented!()`
//
// Execute `rustlings hint box1` for hints :)

// I AM NOT DONE

#[derive(PartialEq, Debug)]
enum List {
Cons(i32, List),
Nil,
}

fn main() {
let empty_list = unimplemented!();
println!("This is an empty cons list: {:?}", empty_list);

let non_empty_list = unimplemented!();
println!("This is a non-empty cons list: {:?}", non_empty_list);

// Do not change these
assert_eq!(List::Nil, empty_list);
assert_ne!(empty_list, non_empty_list);
}
18 changes: 18 additions & 0 deletions info.toml
Original file line number Diff line number Diff line change
Expand Up @@ -614,6 +614,24 @@ hint = """

# STANDARD LIBRARY TYPES

[[exercises]]
name = "box1"
path = "exercises/standard_library_types/box1.rs"
mode = "compile"
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 wee 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"
Expand Down

0 comments on commit 7479a47

Please sign in to comment.