mirror of
https://github.com/rust-lang/rustlings.git
synced 2026-01-11 05:09:19 +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
|
||||
|
||||
use std::fmt::{self, Debug, Formatter};
|
||||
|
||||
/// 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,
|
||||
@ -54,58 +60,17 @@ fn foo(flag: bool) -> ?? {
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod test {
|
||||
|
||||
use super::*;
|
||||
|
||||
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()
|
||||
);
|
||||
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!("{}", ??);
|
||||
}
|
||||
|
||||
@ -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]]
|
||||
name = "traits6"
|
||||
path = "exercises/traits/traits6.rs"
|
||||
mode = "test"
|
||||
mode = "compile"
|
||||
hint = """
|
||||
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<_>
|
||||
|
||||
See the documentation at: https://doc.rust-lang.org/book/ch10-02-traits.html#returning-types-that-implement-traits
|
||||
"""
|
||||
|
||||
[[exercises]]
|
||||
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.
|
||||
Also, in order 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
|
||||
not be printable on console using {:?} symbol.
|
||||
|
||||
See the documentation at: https://doc.rust-lang.org/std/fmt/trait.Debug.html
|
||||
"""
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user