+// Now that's already much shorter! Make sure you can go over the code above and actually understand
+// every step of what's going on.
+
+// ## Inherent implementations
+// So much for `vec_min`. Let us now reconsider `print_number_or_nothing`. That function
+// really belongs pretty close to the type `NumberOrNothing`. In C++ or Java, you would
+// probably make it a method of the type. In Rust, we can achieve something very similar
+// by providing an *inherent implementation*.
+impl NumberOrNothing {
+ fn print(self) {
+ match self {
+ Nothing => println!("The number is: <nothing>"),
+ Number(n) => println!("The number is: {}", n),
+ };
+ }
+}
+// So, what just happened? Rust separates code from data, so the definition of the
+// methods on an `enum` (and also on `struct`, which we will learn about later)
+// is independent of the definition of the type. `self` is like `this` in other
+// languages, and its type is always implicit. So `print` is now a method that
+// takes as first argument a `NumberOrNothing`, just like `print_number_or_nothing`.
+//
+// Try making `number_or_default` from above an inherent method as well!
+
+// With our refactored functions and methods, `main` now looks as follows:
+fn read_vec() -> Vec<i32> {
+ vec![18,5,7,2,9,27]
+}
+pub fn main() {
+ let vec = read_vec();
+ let min = vec_min(vec);
+ min.print();
+}
+// You will have to replace `part00` by `part01` in the `main` function in
+// `main.rs` to run this code.
+
+// **Exercise 01.1**: Write a funtion `vec_sum` that computes the sum of all values of a `Vec<i32>`.
+
+// **Exercise 01.2**: Write a function `vec_print` that takes a vector and prints all its elements.
+