-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbno-salad.rs
136 lines (115 loc) · 2.55 KB
/
bno-salad.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
// From Blandy & Orendorff's *Programming Rust*
pub trait Vegetable {
fn desc(&self) -> &'static str;
}
#[derive(Clone, Copy)]
pub struct Lettuce;
impl Vegetable for Lettuce {
fn desc(&self) -> &'static str {
self.desc()
}
}
#[derive(Clone, Copy)]
pub struct Tomato;
impl Vegetable for Tomato {
fn desc(&self) -> &'static str {
self.desc()
}
}
pub struct GenericSalad<T: Vegetable> {
veggies: Vec<T>,
}
impl<T: Vegetable> GenericSalad<T> {
fn new() -> Self {
GenericSalad {
veggies: Vec::new(),
}
}
fn add(&mut self, v: T) {
self.veggies.push(v);
}
pub fn display(&self) {
for v in &self.veggies {
println!("{}", v.desc());
}
}
}
pub struct TraitSalad {
veggies: Vec<Box<dyn Vegetable>>,
}
impl TraitSalad {
fn new() -> Self {
TraitSalad {
veggies: Vec::new(),
}
}
fn add(&mut self, v: Box<dyn Vegetable>) {
self.veggies.push(v);
}
pub fn display(&self) {
for v in &self.veggies {
println!("{}", v.desc());
}
}
}
impl Lettuce {
fn desc(&self) -> &'static str {
"lettuce"
}
}
impl Tomato {
fn desc(&self) -> &'static str {
"tomato"
}
}
enum SaladVegetable {
SaladLettuce,
SaladTomato,
SaladCucumber,
}
use SaladVegetable::*;
pub struct EnumSalad {
veggies: Vec<SaladVegetable>,
}
impl EnumSalad {
fn new() -> Self {
EnumSalad {
veggies: Vec::new(),
}
}
fn add(&mut self, v: SaladVegetable) {
self.veggies.push(v);
}
pub fn display(&self) {
for v in &self.veggies {
match v {
SaladLettuce => println!("lettuce"),
SaladTomato => println!("tomato"),
SaladCucumber => println!("cucumber"),
}
}
}
}
pub fn make_me_a_generic_lettuce_salad<T: Vegetable + Clone>(veggie: T) ->
GenericSalad<T>
{
let mut generic_salad = GenericSalad::new();
for v in vec![veggie.clone(), veggie.clone()] {
generic_salad.add(v);
}
generic_salad
}
pub fn make_me_a_trait_salad() -> TraitSalad {
let mut trait_salad = TraitSalad::new();
trait_salad.add(Box::new(Lettuce));
trait_salad.add(Box::new(Tomato));
trait_salad
}
pub fn make_me_a_enum_salad() -> EnumSalad {
let mut enum_salad = EnumSalad::new();
enum_salad.add(SaladLettuce);
enum_salad.add(SaladTomato);
enum_salad.add(SaladTomato);
enum_salad.add(SaladCucumber);
enum_salad
}