summaryrefslogtreecommitdiff
path: root/rust/rustlings/exercises/14_generics
diff options
context:
space:
mode:
Diffstat (limited to 'rust/rustlings/exercises/14_generics')
-rw-r--r--rust/rustlings/exercises/14_generics/README.md11
-rw-r--r--rust/rustlings/exercises/14_generics/generics1.rs18
-rw-r--r--rust/rustlings/exercises/14_generics/generics2.rs31
3 files changed, 60 insertions, 0 deletions
diff --git a/rust/rustlings/exercises/14_generics/README.md b/rust/rustlings/exercises/14_generics/README.md
new file mode 100644
index 0000000..0c8c8cb
--- /dev/null
+++ b/rust/rustlings/exercises/14_generics/README.md
@@ -0,0 +1,11 @@
+# Generics
+
+Generics is the topic of generalizing types and functionalities to broader cases.
+This is extremely useful for reducing code duplication in many ways, but can call for some rather involved syntax.
+Namely, being generic requires taking great care to specify over which types a generic type is actually considered valid.
+The simplest and most common use of generics is for type parameters.
+
+## Further information
+
+- [Generic Data Types](https://doc.rust-lang.org/book/ch10-01-syntax.html)
+- [Bounds](https://doc.rust-lang.org/rust-by-example/generics/bounds.html)
diff --git a/rust/rustlings/exercises/14_generics/generics1.rs b/rust/rustlings/exercises/14_generics/generics1.rs
new file mode 100644
index 0000000..7e5571f
--- /dev/null
+++ b/rust/rustlings/exercises/14_generics/generics1.rs
@@ -0,0 +1,18 @@
+// `Vec<T>` is generic over the type `T`. In most cases, the compiler is able to
+// infer `T`, for example after pushing a value with a concrete type to the vector.
+// But in this exercise, the compiler needs some help through a type annotation.
+
+fn main() {
+ // TODO: Fix the compiler error by annotating the type of the vector
+ // `Vec<T>`. Choose `T` as some integer type that can be created from
+ // `u8` and `i8`.
+ let mut numbers: Vec<i32> = Vec::new();
+
+ // Don't change the lines below.
+ let n1: u8 = 42;
+ numbers.push(n1.into());
+ let n2: i8 = -1;
+ numbers.push(n2.into());
+
+ println!("{numbers:?}");
+}
diff --git a/rust/rustlings/exercises/14_generics/generics2.rs b/rust/rustlings/exercises/14_generics/generics2.rs
new file mode 100644
index 0000000..ba77625
--- /dev/null
+++ b/rust/rustlings/exercises/14_generics/generics2.rs
@@ -0,0 +1,31 @@
+// This powerful wrapper provides the ability to store a positive integer value.
+// TODO: Rewrite it using a generic so that it supports wrapping ANY type.
+struct Wrapper<T> {
+ value: T,
+}
+
+// TODO: Adapt the struct's implementation to be generic over the wrapped value.
+impl<T> Wrapper<T> {
+ fn new(value: T) -> Self {
+ Wrapper { value }
+ }
+}
+
+fn main() {
+ // You can optionally experiment here.
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn store_u32_in_wrapper() {
+ assert_eq!(Wrapper::new(42).value, 42);
+ }
+
+ #[test]
+ fn store_str_in_wrapper() {
+ assert_eq!(Wrapper::new("Foo").value, "Foo");
+ }
+}