summaryrefslogtreecommitdiff
path: root/rustlings/exercises/15_traits
diff options
context:
space:
mode:
Diffstat (limited to 'rustlings/exercises/15_traits')
-rw-r--r--rustlings/exercises/15_traits/README.md19
-rw-r--r--rustlings/exercises/15_traits/traits1.rs30
-rw-r--r--rustlings/exercises/15_traits/traits2.rs22
-rw-r--r--rustlings/exercises/15_traits/traits3.rs38
-rw-r--r--rustlings/exercises/15_traits/traits4.rs35
-rw-r--r--rustlings/exercises/15_traits/traits5.rs39
6 files changed, 183 insertions, 0 deletions
diff --git a/rustlings/exercises/15_traits/README.md b/rustlings/exercises/15_traits/README.md
new file mode 100644
index 0000000..ac87c64
--- /dev/null
+++ b/rustlings/exercises/15_traits/README.md
@@ -0,0 +1,19 @@
+# Traits
+
+A trait is a collection of methods.
+
+Data types can implement traits. To do so, the methods making up the trait are defined for the data type. For example, the `String` data type implements the `From<&str>` trait. This allows a user to write `String::from("hello")`.
+
+In this way, traits are somewhat similar to Java interfaces and C++ abstract classes.
+
+Some additional common Rust traits include:
+
+- `Clone` (the `clone` method)
+- `Display` (which allows formatted display via `{}`)
+- `Debug` (which allows formatted display via `{:?}`)
+
+Because traits indicate shared behavior between data types, they are useful when writing generics.
+
+## Further information
+
+- [Traits](https://doc.rust-lang.org/book/ch10-02-traits.html)
diff --git a/rustlings/exercises/15_traits/traits1.rs b/rustlings/exercises/15_traits/traits1.rs
new file mode 100644
index 0000000..85be17e
--- /dev/null
+++ b/rustlings/exercises/15_traits/traits1.rs
@@ -0,0 +1,30 @@
+// The trait `AppendBar` has only one function which appends "Bar" to any object
+// implementing this trait.
+trait AppendBar {
+ fn append_bar(self) -> Self;
+}
+
+impl AppendBar for String {
+ // TODO: Implement `AppendBar` for the type `String`.
+}
+
+fn main() {
+ let s = String::from("Foo");
+ let s = s.append_bar();
+ println!("s: {s}");
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn is_foo_bar() {
+ assert_eq!(String::from("Foo").append_bar(), "FooBar");
+ }
+
+ #[test]
+ fn is_bar_bar() {
+ assert_eq!(String::from("").append_bar().append_bar(), "BarBar");
+ }
+}
diff --git a/rustlings/exercises/15_traits/traits2.rs b/rustlings/exercises/15_traits/traits2.rs
new file mode 100644
index 0000000..d724dc2
--- /dev/null
+++ b/rustlings/exercises/15_traits/traits2.rs
@@ -0,0 +1,22 @@
+trait AppendBar {
+ fn append_bar(self) -> Self;
+}
+
+// TODO: Implement the trait `AppendBar` for a vector of strings.
+// `append_bar` should push the string "Bar" into the vector.
+
+fn main() {
+ // You can optionally experiment here.
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn is_vec_pop_eq_bar() {
+ let mut foo = vec![String::from("Foo")].append_bar();
+ assert_eq!(foo.pop().unwrap(), "Bar");
+ assert_eq!(foo.pop().unwrap(), "Foo");
+ }
+}
diff --git a/rustlings/exercises/15_traits/traits3.rs b/rustlings/exercises/15_traits/traits3.rs
new file mode 100644
index 0000000..c244650
--- /dev/null
+++ b/rustlings/exercises/15_traits/traits3.rs
@@ -0,0 +1,38 @@
+trait Licensed {
+ // TODO: Add a default implementation for `licensing_info` so that
+ // implementors like the two structs below can share that default behavior
+ // without repeating the function.
+ // The default license information should be the string "Default license".
+ fn licensing_info(&self) -> String;
+}
+
+struct SomeSoftware {
+ version_number: i32,
+}
+
+struct OtherSoftware {
+ version_number: String,
+}
+
+impl Licensed for SomeSoftware {} // Don't edit this line.
+impl Licensed for OtherSoftware {} // Don't edit this line.
+
+fn main() {
+ // You can optionally experiment here.
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn is_licensing_info_the_same() {
+ let licensing_info = "Default license";
+ let some_software = SomeSoftware { version_number: 1 };
+ let other_software = OtherSoftware {
+ version_number: "v2.0.0".to_string(),
+ };
+ assert_eq!(some_software.licensing_info(), licensing_info);
+ assert_eq!(other_software.licensing_info(), licensing_info);
+ }
+}
diff --git a/rustlings/exercises/15_traits/traits4.rs b/rustlings/exercises/15_traits/traits4.rs
new file mode 100644
index 0000000..80092a6
--- /dev/null
+++ b/rustlings/exercises/15_traits/traits4.rs
@@ -0,0 +1,35 @@
+trait Licensed {
+ fn licensing_info(&self) -> String {
+ "Default license".to_string()
+ }
+}
+
+struct SomeSoftware;
+struct OtherSoftware;
+
+impl Licensed for SomeSoftware {}
+impl Licensed for OtherSoftware {}
+
+// TODO: Fix the compiler error by only changing the signature of this function.
+fn compare_license_types(software1: ???, software2: ???) -> bool {
+ software1.licensing_info() == software2.licensing_info()
+}
+
+fn main() {
+ // You can optionally experiment here.
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn compare_license_information() {
+ assert!(compare_license_types(SomeSoftware, OtherSoftware));
+ }
+
+ #[test]
+ fn compare_license_information_backwards() {
+ assert!(compare_license_types(OtherSoftware, SomeSoftware));
+ }
+}
diff --git a/rustlings/exercises/15_traits/traits5.rs b/rustlings/exercises/15_traits/traits5.rs
new file mode 100644
index 0000000..5b356ac
--- /dev/null
+++ b/rustlings/exercises/15_traits/traits5.rs
@@ -0,0 +1,39 @@
+trait SomeTrait {
+ fn some_function(&self) -> bool {
+ true
+ }
+}
+
+trait OtherTrait {
+ fn other_function(&self) -> bool {
+ true
+ }
+}
+
+struct SomeStruct;
+impl SomeTrait for SomeStruct {}
+impl OtherTrait for SomeStruct {}
+
+struct OtherStruct;
+impl SomeTrait for OtherStruct {}
+impl OtherTrait for OtherStruct {}
+
+// TODO: Fix the compiler error by only changing the signature of this function.
+fn some_func(item: ???) -> bool {
+ item.some_function() && item.other_function()
+}
+
+fn main() {
+ // You can optionally experiment here.
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn test_some_func() {
+ assert!(some_func(SomeStruct));
+ assert!(some_func(OtherStruct));
+ }
+}