-
Notifications
You must be signed in to change notification settings - Fork 0
/
animals.rb
133 lines (110 loc) · 2.46 KB
/
animals.rb
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
require_relative 'modules'
# Como sólo vamos a tener un zoológico para todos los animales, vamos a utilizar métodos y atributos
# de clase para no tener que instanciar ningún SuperZoo antes de agregar animales.
class SuperZoo
# Los atributos de clase comienzan con `@@`
@@animals = []
# Los métodos de clase comienzan con `self.`
def self.animals
@@animals
end
# Se puede iterar o realizar cualquier acción sobre los atributos tal y como una clase regular.
def self.total_weight
total = 0
@@animals.each do |animal|
total += animal.weight
end
total
end
def self.mammals
mammals = []
@@animals.each do |animal|
mammals.push(animal) if animal.is_a?(Mammal)
end
mammals
end
def self.make_all_noises
@@animals.each do |animal|
puts "Hi, I'm a #{animal.class.name} and my noise is #{animal.make_noise}"
end
end
def self.has_birds?
@@animals.each do |animal|
return true if animal.is_a?(Bird)
end
false
end
end
# Todos los animales heredarán de la clase `Animal`, la cual les dará automáticamente sus atributos.
class Animal
# Todos los animales compartirán estos atributos.
attr_accessor :hair_color
attr_accessor :weight
attr_accessor :age
def initialize
@weight = 0.0
end
def make_noise
end
end
# `Bird` es una clase intermedia para definir todas las aves. Agrega métodos específicos para aves.
class Bird < Animal
def lay_eggs
end
end
# `Mammal` es una clase intermedia para definir los mamíferos.
class Mammal < Animal
attr_accessor :breed
end
class Duck < Bird
# El pato puede hablar y también es comestible, por eso incluye los módulos `Speakable`
# y `Edible`. Al hacer esto incluirán todos los métodos y propiedades de esos módulos.
include Speakable
include Edible
def initialize
super
@language = "Chinese"
@meat_type = "White Meat"
@alive = true
end
def make_noise
"quack"
end
def eat_me
@alive = false
"Quack quack yum yum"
end
def speak
return super if @alive
"I'm dead x_x"
end
end
class Cat < Mammal
def make_noise
if @breed == "Persian"
"meow"
else
"miau"
end
end
end
class Dog < Mammal
include Speakable
def initialize
super
@language = "Russian"
end
def make_noise
"woof"
end
end
class Cow < Mammal
include Edible
def initialize
super
@meat_type = "Red Meat"
end
def make_noise
"moooooo"
end
end