summaryrefslogtreecommitdiff
path: root/exercises/15_traits
diff options
context:
space:
mode:
Diffstat (limited to 'exercises/15_traits')
-rw-r--r--exercises/15_traits/traits1.rs24
-rw-r--r--exercises/15_traits/traits2.rs23
-rw-r--r--exercises/15_traits/traits3.rs28
-rw-r--r--exercises/15_traits/traits4.rs40
-rw-r--r--exercises/15_traits/traits5.rs39
5 files changed, 59 insertions, 95 deletions
diff --git a/exercises/15_traits/traits1.rs b/exercises/15_traits/traits1.rs
index 37dfcbf..85be17e 100644
--- a/exercises/15_traits/traits1.rs
+++ b/exercises/15_traits/traits1.rs
@@ -1,26 +1,17 @@
-// traits1.rs
-//
-// Time to implement some traits! Your task is to implement the trait
-// `AppendBar` for the type `String`. The trait AppendBar has only one function,
-// which appends "Bar" to any object implementing this trait.
-//
-// Execute `rustlings hint traits1` or use the `hint` watch subcommand for a
-// hint.
-
-// I AM NOT DONE
-
+// 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 type `String`.
+ // TODO: Implement `AppendBar` for the type `String`.
}
fn main() {
let s = String::from("Foo");
let s = s.append_bar();
- println!("s: {}", s);
+ println!("s: {s}");
}
#[cfg(test)]
@@ -29,14 +20,11 @@ mod tests {
#[test]
fn is_foo_bar() {
- assert_eq!(String::from("Foo").append_bar(), String::from("FooBar"));
+ assert_eq!(String::from("Foo").append_bar(), "FooBar");
}
#[test]
fn is_bar_bar() {
- assert_eq!(
- String::from("").append_bar().append_bar(),
- String::from("BarBar")
- );
+ assert_eq!(String::from("").append_bar().append_bar(), "BarBar");
}
}
diff --git a/exercises/15_traits/traits2.rs b/exercises/15_traits/traits2.rs
index 3e35f8e..d724dc2 100644
--- a/exercises/15_traits/traits2.rs
+++ b/exercises/15_traits/traits2.rs
@@ -1,20 +1,13 @@
-// traits2.rs
-//
-// Your task is to implement the trait `AppendBar` for a vector of strings. To
-// implement this trait, consider for a moment what it means to 'append "Bar"'
-// to a vector of strings.
-//
-// No boiler plate code this time, you can do this!
-//
-// Execute `rustlings hint traits2` or use the `hint` watch subcommand for a hint.
-
-// I AM NOT DONE
-
trait AppendBar {
fn append_bar(self) -> Self;
}
-// TODO: Implement trait `AppendBar` for a vector of strings.
+// 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 {
@@ -23,7 +16,7 @@ mod tests {
#[test]
fn is_vec_pop_eq_bar() {
let mut foo = vec![String::from("Foo")].append_bar();
- assert_eq!(foo.pop().unwrap(), String::from("Bar"));
- assert_eq!(foo.pop().unwrap(), String::from("Foo"));
+ assert_eq!(foo.pop().unwrap(), "Bar");
+ assert_eq!(foo.pop().unwrap(), "Foo");
}
}
diff --git a/exercises/15_traits/traits3.rs b/exercises/15_traits/traits3.rs
index 4e2b06b..2e8969e 100644
--- a/exercises/15_traits/traits3.rs
+++ b/exercises/15_traits/traits3.rs
@@ -1,16 +1,10 @@
-// traits3.rs
-//
-// Your task is to implement the Licensed trait for both structures and have
-// them return the same information without writing the same function twice.
-//
-// Consider what you can add to the Licensed trait.
-//
-// Execute `rustlings hint traits3` or use the `hint` watch subcommand for a
-// hint.
+#![allow(dead_code)]
-// I AM NOT DONE
-
-pub trait Licensed {
+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;
}
@@ -22,8 +16,12 @@ struct OtherSoftware {
version_number: String,
}
-impl Licensed for SomeSoftware {} // Don't edit this line
-impl Licensed for OtherSoftware {} // Don't edit this line
+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 {
@@ -31,7 +29,7 @@ mod tests {
#[test]
fn is_licensing_info_the_same() {
- let licensing_info = String::from("Some information");
+ let licensing_info = "Default license";
let some_software = SomeSoftware { version_number: 1 };
let other_software = OtherSoftware {
version_number: "v2.0.0".to_string(),
diff --git a/exercises/15_traits/traits4.rs b/exercises/15_traits/traits4.rs
index 4bda3e5..80092a6 100644
--- a/exercises/15_traits/traits4.rs
+++ b/exercises/15_traits/traits4.rs
@@ -1,30 +1,22 @@
-// traits4.rs
-//
-// Your task is to replace the '??' sections so the code compiles.
-//
-// Don't change any line other than the marked one.
-//
-// Execute `rustlings hint traits4` or use the `hint` watch subcommand for a
-// hint.
-
-// I AM NOT DONE
-
-pub trait Licensed {
+trait Licensed {
fn licensing_info(&self) -> String {
- "some information".to_string()
+ "Default license".to_string()
}
}
-struct SomeSoftware {}
-
-struct OtherSoftware {}
+struct SomeSoftware;
+struct OtherSoftware;
impl Licensed for SomeSoftware {}
impl Licensed for OtherSoftware {}
-// YOU MAY ONLY CHANGE THE NEXT LINE
-fn compare_license_types(software: ??, software_two: ??) -> bool {
- software.licensing_info() == software_two.licensing_info()
+// 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)]
@@ -33,17 +25,11 @@ mod tests {
#[test]
fn compare_license_information() {
- let some_software = SomeSoftware {};
- let other_software = OtherSoftware {};
-
- assert!(compare_license_types(some_software, other_software));
+ assert!(compare_license_types(SomeSoftware, OtherSoftware));
}
#[test]
fn compare_license_information_backwards() {
- let some_software = SomeSoftware {};
- let other_software = OtherSoftware {};
-
- assert!(compare_license_types(other_software, some_software));
+ assert!(compare_license_types(OtherSoftware, SomeSoftware));
}
}
diff --git a/exercises/15_traits/traits5.rs b/exercises/15_traits/traits5.rs
index df18380..5b356ac 100644
--- a/exercises/15_traits/traits5.rs
+++ b/exercises/15_traits/traits5.rs
@@ -1,40 +1,39 @@
-// traits5.rs
-//
-// Your task is to replace the '??' sections so the code compiles.
-//
-// Don't change any line other than the marked one.
-//
-// Execute `rustlings hint traits5` or use the `hint` watch subcommand for a
-// hint.
-
-// I AM NOT DONE
-
-pub trait SomeTrait {
+trait SomeTrait {
fn some_function(&self) -> bool {
true
}
}
-pub trait OtherTrait {
+trait OtherTrait {
fn other_function(&self) -> bool {
true
}
}
-struct SomeStruct {}
-struct OtherStruct {}
-
+struct SomeStruct;
impl SomeTrait for SomeStruct {}
impl OtherTrait for SomeStruct {}
+
+struct OtherStruct;
impl SomeTrait for OtherStruct {}
impl OtherTrait for OtherStruct {}
-// YOU MAY ONLY CHANGE THE NEXT LINE
-fn some_func(item: ??) -> bool {
+// 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() {
- some_func(SomeStruct {});
- some_func(OtherStruct {});
+ // You can optionally experiment here.
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn test_some_func() {
+ assert!(some_func(SomeStruct));
+ assert!(some_func(OtherStruct));
+ }
}