mirror of
https://github.com/rust-lang/rustlings.git
synced 2026-01-11 13:19:18 +00:00
combined traits6 & traits7 into traits6 with compile
This commit is contained in:
parent
29388557f8
commit
db8e9e85d6
@ -6,11 +6,17 @@
|
|||||||
|
|
||||||
// I AM NOT DONE
|
// I AM NOT DONE
|
||||||
|
|
||||||
|
use std::fmt::{self, Debug, Formatter};
|
||||||
|
|
||||||
|
/// Struct representing a house
|
||||||
|
#[derive(Default)]
|
||||||
struct House {
|
struct House {
|
||||||
area_sqft: u32,
|
area_sqft: u32,
|
||||||
purchase_date: String,
|
purchase_date: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Struct representing a vehicle
|
||||||
|
#[derive(Default)]
|
||||||
struct Vehicle {
|
struct Vehicle {
|
||||||
name: String,
|
name: String,
|
||||||
model: String,
|
model: String,
|
||||||
@ -54,58 +60,17 @@ fn foo(flag: bool) -> ?? {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
impl Debug for dyn Details {
|
||||||
mod test {
|
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
|
||||||
|
// print the summary of the struct returned from the function `foo`
|
||||||
use super::*;
|
write!(f, "{}", ??) // TODO: Complete the code
|
||||||
|
|
||||||
fn init() -> (House, Vehicle) {
|
|
||||||
let house = House {
|
|
||||||
area_sqft: 5000,
|
|
||||||
purchase_date: "21 Nov 2017".to_string(),
|
|
||||||
};
|
|
||||||
let vehicle = Vehicle {
|
|
||||||
name: "BMW".to_string(),
|
|
||||||
model: "320d".to_string(),
|
|
||||||
purchase_date: "13 Aug 2022".to_string(),
|
|
||||||
};
|
|
||||||
|
|
||||||
(house, vehicle)
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn check_foo_returns_house_if_true() {
|
|
||||||
let (house, _) = init();
|
|
||||||
assert_eq!(house.summary(), foo(true).summary());
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn check_foo_returns_vehicle_if_false() {
|
|
||||||
let (_, vehicle) = init();
|
|
||||||
assert_eq!(vehicle.summary(), foo(false).summary());
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn check_purchase_date_for_house() {
|
|
||||||
let (house, _) = init();
|
|
||||||
assert_eq!(
|
|
||||||
format!(
|
|
||||||
"The house has an area of {} sqft and was purchased on {}",
|
|
||||||
house.area_sqft, house.purchase_date
|
|
||||||
),
|
|
||||||
house.summary()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn check_purchase_date_for_vehicle() {
|
|
||||||
let (_, vehicle) = init();
|
|
||||||
assert_eq!(
|
|
||||||
format!(
|
|
||||||
"The {} vehicle with model {} was purchased on {}",
|
|
||||||
vehicle.name, vehicle.model, vehicle.purchase_date
|
|
||||||
),
|
|
||||||
vehicle.summary()
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn main() {
|
||||||
|
let x = foo(true);
|
||||||
|
println!("{:?}", x);
|
||||||
|
// TODO: Complete the code
|
||||||
|
// print the summary of the struct returned from the function `foo`
|
||||||
|
println!("{}", ??);
|
||||||
|
}
|
||||||
|
|||||||
@ -1,76 +0,0 @@
|
|||||||
// traits7.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 traits7` or use the `hint` watch subcommand for a hint.
|
|
||||||
|
|
||||||
// I AM NOT DONE
|
|
||||||
|
|
||||||
use std::fmt::{Debug};
|
|
||||||
|
|
||||||
/// Struct representing a house
|
|
||||||
#[derive(Default)]
|
|
||||||
struct House {
|
|
||||||
area_sqft: u32,
|
|
||||||
purchase_date: String,
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Struct representing a vehicle
|
|
||||||
#[derive(Default)]
|
|
||||||
struct Vehicle {
|
|
||||||
name: String,
|
|
||||||
model: String,
|
|
||||||
purchase_date: String,
|
|
||||||
}
|
|
||||||
|
|
||||||
trait Details {
|
|
||||||
fn summary(&self) -> String;
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Details for House {
|
|
||||||
fn summary(&self) -> String {
|
|
||||||
format!(
|
|
||||||
"The house has an area of {} sqft and was purchased on {}",
|
|
||||||
self.area_sqft, self.purchase_date
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
impl Details for Vehicle {
|
|
||||||
fn summary(&self) -> String {
|
|
||||||
format!(
|
|
||||||
"The {} vehicle with model {} was purchased on {}",
|
|
||||||
self.name, self.model, self.purchase_date
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: Complete the code
|
|
||||||
fn foo(flag: bool) -> ?? {
|
|
||||||
if flag {
|
|
||||||
Box::new(House {
|
|
||||||
area_sqft: 5000,
|
|
||||||
purchase_date: "21 Nov 2017".to_string(),
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
Box::new(Vehicle {
|
|
||||||
name: "BMW".to_string(),
|
|
||||||
model: "320d".to_string(),
|
|
||||||
purchase_date: "13 Aug 2022".to_string(),
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Debug for dyn Details {
|
|
||||||
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
|
|
||||||
// print the summary of the struct returned from the function `foo`
|
|
||||||
write!(f, "{}", ??) // TODO: Complete the code
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn main() {
|
|
||||||
let x = foo(true);
|
|
||||||
println!("{:?}", x);
|
|
||||||
// TODO: Complete the code
|
|
||||||
// print the summary of the struct returned from the function `foo`
|
|
||||||
println!("{}", ??);
|
|
||||||
}
|
|
||||||
12
info.toml
12
info.toml
@ -740,23 +740,15 @@ See the documentation at: https://doc.rust-lang.org/book/ch10-02-traits.html#spe
|
|||||||
[[exercises]]
|
[[exercises]]
|
||||||
name = "traits6"
|
name = "traits6"
|
||||||
path = "exercises/traits/traits6.rs"
|
path = "exercises/traits/traits6.rs"
|
||||||
mode = "test"
|
mode = "compile"
|
||||||
hint = """
|
hint = """
|
||||||
To ensure a function is able to return incompatible types can be done by using a trait bound that is common to them.
|
To ensure a function is able to return incompatible types can be done by using a trait bound that is common to them.
|
||||||
Wrap the shared trait (implemented by the 2 struct types/objects) as a Boxed trait object. Try replacing the '??' with Box<_>
|
Wrap the shared trait (implemented by the 2 struct types/objects) as a Boxed trait object. Try replacing the '??' with Box<_>
|
||||||
|
|
||||||
See the documentation at: https://doc.rust-lang.org/book/ch10-02-traits.html#returning-types-that-implement-traits
|
See the documentation at: https://doc.rust-lang.org/book/ch10-02-traits.html#returning-types-that-implement-traits
|
||||||
"""
|
|
||||||
|
|
||||||
[[exercises]]
|
Also, in order to make the function printable on console using `:?` symbol. Use the `Debug` trait for the `Details` trait.
|
||||||
name = "traits7"
|
|
||||||
path = "exercises/traits/traits7.rs"
|
|
||||||
mode = "compile"
|
|
||||||
hint = """
|
|
||||||
To make the function printable on console using `:?` symbol. Use the `Debug` trait for the `Details` trait.
|
|
||||||
Here, the trait object has to implement `Debug` trait, otherwise the function returning trait object will
|
Here, the trait object has to implement `Debug` trait, otherwise the function returning trait object will
|
||||||
not be printable on console using {:?} symbol.
|
not be printable on console using {:?} symbol.
|
||||||
|
|
||||||
See the documentation at: https://doc.rust-lang.org/std/fmt/trait.Debug.html
|
See the documentation at: https://doc.rust-lang.org/std/fmt/trait.Debug.html
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user