+
+// Phew. We wrote our first Rust function! But all this `NumberOrNothing::` is getting kind of
+// ugly. Can't we do that nicer?
+
+// Indeed, we can: The following line tells Rust to take
+// the constructors of `NumberOrNothing` into the local namespace.
+// Try moving that above the function, and removing all the occurrences `NumberOrNothing::`.
+use self::NumberOrNothing::{Number,Nothing};
+
+// To call this function, we now just need a list. Of course, ultimately we want to ask the user for
+// a list of numbers, but for now, let's just hard-code something.
+
+// `vec!` is a *macro* (as you can tell from the `!`) that constructs a constant `Vec<_>` with the given
+// elements.
+fn read_vec() -> Vec<i32> {
+ vec![18,5,7,1,9,27]
+}
+
+// Finally, let's call our functions and run the code!
+// But, wait, we would like to actually see something, so we need to print the result.
+// Of course Rust can print numbers, but after calling `vec_min`, we have a `NumberOrNothing`.
+// So let's write a small helper function that prints such values.
+
+//@ `println!` is again a macro, where the first argument is a *format string*. For
+//@ now, you just need to know that `{}` is the placeholder for a value, and that Rust
+//@ will check at compile-time that you supplied the right number of arguments.
+fn print_number_or_nothing(n: NumberOrNothing) {
+ match n {
+ Nothing => println!("The number is: <nothing>"),
+ Number(n) => println!("The number is: {}", n),
+ };
+}
+
+// Putting it all together:
+pub fn main() {
+ let vec = read_vec();
+ let min = vec_min(vec);
+ print_number_or_nothing(min);
+}
+
+// Now try `cargo run` on the console to run above code.
+
+//@ Yay, it said "1"! That's actually the right answer. Okay, we could have
+//@ computed that ourselves, but that's besides the point. More importantly:
+//@ You completed the first part of the course.
+
+// [index](main.html) | previous | [next](part01.html)