You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

92 lines
2.1 KiB

## car_rental
### Instructions
Create a struct named `Car` and another one named `RentalBusiness`.
The scope of the exercise will be to modify and operate on the `Car` in the `RentalBusiness` even if this element is not declared as mutable, introducing the concept of interior mutability.
To accomplish that you will create some associated methods of `RentalBusiness` that will return the field `car` in many different ways.
### Expected Functions and Structures
```rust
use std::cell::Ref;
use std::cell::RefCell;
use std::cell::RefMut;
#[derive(Debug, Default, PartialEq, Eq)]
pub struct Car {
pub color: String,
pub plate: String,
}
#[derive(Debug)]
pub struct RentalBusiness {
pub car: RefCell<Car>,
}
impl RentalBusiness {
pub fn rent_car(&self) -> Ref<Car> {}
pub fn sell_car(&self) -> Car {}
pub fn repair_car(&self) -> RefMut<Car> {}
pub fn change_car(&self, new_car: Car) {}
}
```
### Usage
Here is a program to test your function:
```rust
use car_rental::*;
use std::cell::RefCell;
fn main() {
let car_rental = RentalBusiness {
car: RefCell::new(Car {
color: "red".to_string(),
plate: "AAA".to_string(),
}),
};
println!("{:?}", car_rental.rent_car());
println!("{:?}", car_rental.repair_car());
{
let mut car = car_rental.repair_car();
car.color = "blue".to_string();
}
println!("{:?}", car_rental.rent_car());
car_rental.change_car(Car {
color: "pink".to_string(),
plate: "WWW".to_string(),
});
println!("{:?}", car_rental.rent_car());
println!("{:?}", car_rental.sell_car());
println!("{:?}", car_rental.sell_car());
}
```
And its output:
```console
$ cargo run
Car { color: "red", plate: "AAA" }
Car { color: "red", plate: "AAA" }
Car { color: "blue", plate: "AAA" }
Car { color: "pink", plate: "WWW" }
Car { color: "pink", plate: "WWW" }
Car { color: "", plate: "" }
$
```
### Notions
- [std::cell::RefCell](https://doc.rust-lang.org/std/cell/struct.RefCell.html)
- [Struct std::rc::Rc](https://doc.rust-lang.org/std/rc/struct.Rc.html)