Fundamentos de Programación Con Ruby
Fundamentos de Programación Con Ruby
FUNDAMENTOS
DE
PROGRAMACIÓN
CON RUBY
LUIS EDUARDO MUÑOZ G.
2
Las opiniones expresadas en los artículos son de exclusiva
responsabilidad de los autores y no indican, necesariamente,
el punto de vista de la Corporación CIMTED.
3
PÁGINA LEGAL
Título de la obra: Fundamentos de programación con
Ruby
ISBN: 978-958-53925-6-4
Sello editorial: Corporación Centro Internacional de
Marketing Territorial para la Educación y el Desarrollo
(978-958-53925)
Materia: Programación
Tipo de contenido: Computación y sistemas
Público objetivo: Formación de adultos
Idioma: Español
Tipo de soporte: Libro digital descargable
Formato: Pdf (.pdf)
Editorial: Corporación Centro Internacional de Marketing
Territorial para la Educación y el Desarrollo
Número de identi cación tributaria: 811043395-0
Email: [email protected]
Fecha de publicación: Noviembre 2022
Depósito digital:
4
fi
AGRADECIMIENTOS
A mi hijo Alejandro, por siempre recordarme el signi cado
de la palabra amor verdadero.
5
fi
INTRODUCCIÓN
Este documento presenta los conceptos fundamentales
de la programación imperativa desarrollada con el lenguaje
de Ruby. Se hablará sobre temas relacionados con los tipos
de datos, las funciones y estructuras de control, hasta el
manejo de estructuras de datos como arreglos, listas, pilas,
colas y hashes, así como introducir el tema de la algoritmia y
el paradigma de la programación orientada a objetos
(conocida también como POO).
6
fi
fi
fi
Tabla de contenido
Página legal 4
AGRADECIMIENTOS 5
INTRODUCCIÓN 6
Tabla de contenido 7
Lista de ilustraciones 11
Lista de tablas 12
3 48
Estructuras de control y ujo 48
3.1 Condicionales 48
3.2 Iteradores 51
3.3 Ejemplos de uso 52
3.4 Ejercicios propuestos 68
3.5 Retroalimentación del capítulo 71
4. 73
Funciones 73
4.1 Estructura 74
4.2 Funcionamiento 75
4.3 Ejercicios propuestos 83
4.4 Retroalimentación del capitulo 83
5 85
Manejo de tipos de datos compuestos (estructuras
de datos) 85
5.1 Conceptos sobre las estructuras de datos 85
8
fl
5.2 Arreglos 87
5.3 Listas 93
5.4 Ejemplos del uso de Listas y arreglos 95
5.5 Pilas y colas 101
5.6 Hashes 103
5.7 Operaciones fundamentales entre estructuras 104
5.8 Retroalimentación del capitulo 107
6 109
Lista de algoritmos más utilizados en
programación 109
6.1 ¿Qué son los algoritmos? 109
6.2 Características y clasi cación de los algoritmos 110
6.3 Pseudocódigo 112
6.4 Algoritmos populares 114
6.5 Retroalimentación del capitulo 129
7 130
POO (programación orientada a objetos) 130
7.1 ¿Qué es la programación orientada a objetos (POO)? 131
7.2 ¿Qué es un objeto?, ¿qué hay de las clases? 131
7.3 Polimor smo 146
7.4 Retroalimentación del capitulo 147
8 148
Anexos 148
9
fi
fi
REFERENCIAS DE BIBLIOGRAFÍA Y WEBGRAFÍA
149
10
Lista de ilustraciones
11
fi
fi
Lista de tablas
12
INTRODUCCIÓN AL LENGUAJE DE RUBY
13
1.
EL LENGUAJE DE PROGRAMACIÓN
RUBY
16
fl
fi
● Es un lenguaje compilado justo en el tiempo de
ejecución (Just-in-time compilation por sus siglas en inglés).
Esta es una técnica que utiliza las dos formas de traducción
de código conocidas, la compilación y la interpretación,
donde primero se compila el código volviéndolo a código de
bits (bytecode en inglés) para luego justo al momento de
iniciar la ejecución del programa, se inicie al mismo tiempo la
interpretación (traducción) del código de bits anterior al
código de máquina.
18
fi
fi
fi
fi
fi
fi
fi
fi
1.4.1 Procesos de descarga e instalación (Mac)
$ brew -v
19
● Luego de tener la herramienta gestionadora de
paquetes, se debe de correr el siguiente comando en
terminal:
20
fi
fi
fi
fi
1.5 Primeras interacciones con el entorno
21
fi
¡¡¡Con ello se ha creado el primer código en Ruby!!!
22
COMO ESCRIBIR CÓDIGO EN RUBY
Se hablará sobre la estructura de la sintaxis utilizada en
Ruby para la escritura de pequeños programas, así como
analizar temas fundamentales para la programación como los
tipos de datos y operadores, estructuras de control y ujo,
funciones, estructuras de datos. Por último, se explicarán
temas más avanzados como la programación orientada a
objetos.
23
fl
2.
ESTRUCTURA DE CÓDIGO
24
Nombre Suma Resta Multiplicación División
Símbolo + - * /
(4 *(3*(3+90) / (78*1034)))
(20/45*(89+17*49))
Orden
Multiplicación (*)
División (/)
25
fi
Suma (+)
Resta (-)
Tabla 2. Simbología de operado
Ejemplo
1 print("NOT: < true -> (Not) -> #{!true} > || < false -> (Not) -
3 print("AND: < true (And) false -> #{true && false} > || < false
26
4 (And) false -> #{false and false} >\n")
5 print("OR: < true (or) false -> #{true || false} > || < false
AND: < true (And) false -> false > || < false (And) false -> false
>
OR: < true (or) false -> true > || < false (And) false -> false >
A B A && B
Verdad Verdad Verdad
Verdad Falso Falso
Falso Verdad Falso
Falso Falso Falso
Tabla 4. Tabla de verdad para el operador lógico y binario and (&&, &).
A B A II B
Verdad Verdad Verdad
Verdad Falso Verdad
Falso Verdad Verdad
Falso Falso Falso
Tabla 5. Tabla de verdad para el operador lógico y binario or (||, |).
27
Nombre Símbolo
NOT !,~
AND &
OR |
29
fi
fi
idea. Todo ello permite desglosar un cúmulo de información
en partes trabajables y analizables. Del mismo modo pasa en
las computadoras, y de una manera mucho más rígida.
2.2.1 Primitivos
● Enteros
30
fi
fi
● Flotantes
● Booleanos
● Caracteres
● Strings
2.2.2 Compuestos
● Arreglos
● Matrices
● Listas
● Pilas y colas
● Tablas hash
● Árboles binarios
32
fi
fi
fi
2.3 Variables
33
fi
fi
fi
Código escrito en Ruby Resultado
34
fi
fi
Cuando se menciona “según el alcance” se hace
referencia al espacio existente accesible por una variable, es
decir, dependiendo del lugar en donde se cree o se “declare”
la variable, se determinará si esta es local o global.
2.4 Constantes
37
fi
fi
fl
almacenamiento de información como su manejo para
mostrarse al usuario. Dichas funciones son:
38
fl
fi
La ejecución:
El resultado sería:
39
fi
Su ejecución:
Ejemplo #1
40
fl
fi
fi
En el código anterior se utilizan las funciones necesarias
para la obtención e impresión de datos por pantalla (puts,
print, gets). Este funciona de tal manera que se pueda
obtener dos números con los cuales se podría realizar
operaciones aritméticas básicas como la suma, resta,
multiplicación y división. Por otra parte, hay ciertas
características como el uso de la estructura #{…} o el manejo
de castings (término que se re ere a cambio o paso de un
tipo de dato a otro, por ejemplo, pasar un dato de tipo string
a uno de tipo entero) para poder convertir la información
ingresada por el usuario en datos manejables por las
operaciones descritas.
41
fi
42
Ejemplo #2
43
fi
number_a = 1
number_b = 2
number_c = 3
number_d = 4
44
fl
fi
fi
1. Crear un programa que permita calcular el volumen
de un cilindro, una esfera y un cono. Las ecuaciones de
las respectivas guras son:
45
fi
fl
clientes que se deben de alcanzar es más de 15 (es
decir, cliente >= 15).
5. En una tienda de variedades se ofrecen descuentos
en cada categoría. Las categorías son: juguetes para
niños con 10%, cuadros de arte con el 5%, productos de
maquillaje con el 7% y ropa con el 9%. Un cliente desea
llevar $100.000 en juguetes para niños, $50.000 en
cuadros de arte, $35.000 en productos de maquillaje y
$100.000 en ropa. Se necesita calcular el descuento
total por cada tipo de producto, posteriormente
entregar el valor total a pagar con descuento y sin
descuento.
46
determina la prioridad con la que se leen al momento de
crear y evaluar expresiones
47
fl
fi
fi
fl
3
ESTRUCTURAS DE CONTROL Y FLUJO
3.1 Condicionales
También llamadas de selección, son estructuras que
proporcionan un conjunto de acciones siempre y cuando se
cumpla una condición dada. Algunos modelos son:
48
fi
fl
If <condiciones>
<Bloque de instrucciones #1>
else
<Bloque de instrucciones #2>
If( <condiciones> )
<Bloque de instrucciones #1>
elsif
<Bloque de instrucciones #2>
.
.
.
else
49
<Bloque de instrucciones #n>
case <variable>
3.2 Iteradores
3.2.1 For
for <variable> in [variable o tope] do
<bloque de operaciones>
end
3.2.2 While
while <condición> do
<bloque de operaciones>
end
51
fi
fi
3.2.3 While modi cado
También:
begin
<bloque de instrucciones>
end while <condición>
until <condición> do
<bloque de instrucciones>
end
52
fi
fi
Código solución
54
Cabe resaltar que lo que causa los grandes espacios en
blanco entre cada mensaje producido es el uso de las
funciones puts y los caracteres especiales ‘\n’ que indica que
la siguiente impresión se haga en una nueva línea. Existen
otros tipos de caracteres especiales (conocidos como
caracteres de escape) como ‘\t’ para tabulación, ‘\s’ o
‘\space’ para generar un nuevo espacio, entre otros.
Código solución
55
El código anterior resuelve la situación descrita por dos
métodos diferentes, cada uno se emplea según los
siguientes análisis:
56
fi
● Usando el método No. 1:
Código solución
57
fi
La famosa serie de Fibonacci, la cual inicia como
0,1,1,2,3,5,8,13,21,34, 55, [n = (n-2) + (n-1) + … ] también puede
ser representada por medio de una estructura de iteración
for. El razonamiento para poder ejecutar lo solicitado es el
siguiente:
58
fi
fi
fi
fi
fi
● Elaborar un programa que permita imprimir en pantalla
las siguientes guras:
59
fi
Código solución
Forma #1
60
Forma #2
61
fi
fi
Figura #1
Figura #2
Caso #1
62
fi
fi
fi
par de dos en dos, siendo un caso de ejemplo con un límite
de las igual a seis, la primera la estaría con doce
asteriscos, la segunda con diez, la tercera con ocho, y así
sucesivamente hasta llegar al mínimo posible que en este
caso sería dos.
print(" "*espacios)
numero_asteriscos = (2*iteracion)
65
fi
fi
fi
fi
fi
fi
Código solución
67
encontrar cual es la pieza de código encargada de esta tarea
de veri cación.
68
fi
primer cuadro del tablero, en el segundo ubicará el
doble del primero, en el tercero el doble del segundo y
así sucesivamente hasta completar los 64 cuadrados.
Ejemplo:
70
fi
11. Leer un número positivo e imprimir las sumas de
números enteros positivos consecutivos que den el
número introducido. Por ejemplo:
50 = 8 9 + 10 + II + 12
50 = II + 12 + 13 + 14
If <condiciones>
<Bloque de instrucciones #1>
else
<Bloque de instrucciones #2>
case <variable>
71
fl
fi
when <Valor 1 variable> {<bloque de
instrucciones #1>} when <Valor 2
variable> {<bloque de instrucciones
#2>}
.
.
.
when <Valor n variable> {<bloque de
instrucciones n>} else {<bloque de
instrucciones>}
end
<bloque de operaciones>
End
while <condición> do
<bloque de operaciones>
End
72
4.
FUNCIONES
73
fi
● Encontrar alguna expresión que relacione la
información (catetos) con el resultado solicitado.
● Proponer los pasos que se deberán de seguir para
encontrar el resultado solicitado.
● Pruebas de escritorio, es decir, probar los pasos
generados en el punto anterior antes de pasar a su
implementación en código.
● Implementación del punto anterior.
o Resolver la expresión encontrada para el cálculo del
valor solicitado en cada una de las partes que la componen.
● Pruebas.
● Dar solución con la implementación en código del
ejercicio.
4.1 Estructura
La creación de funciones en Ruby sigue la siguiente
estructura:
*Cuerpo de instrucciones
end
74
fi
fi
fi
La expresión name indica el nombre de la función, (<lista
de parámetros>) es el apartado donde se podrán determinar
variables externas que se pueden necesitar. Lo anterior es
una característica fundamental para las funciones. En algunas
situaciones se requieren cálculos con procedimientos
distintos a los que ya se encuentran ejecutados por la
función en donde se requiere dicho parámetro, por lo que
surge la necesidad de tomarlos como parámetros que
ingresan en otras funciones y no como expresiones locales
de la función.
4.2 Funcionamiento
Como ya se indicó en la sección anterior del capítulo, las
funciones ayudan a determinar tareas generales a partir de
pequeñas partes o divisiones, contribuyendo todas a un
objetivo general. Por tal motivo el uso de las funciones tiene
75
fi
ciertas particularidades en la programación; términos y
expresiones como “llamado de una función”, “paso de
valores”, entre otras, serán algunas de las cuales se aclaran a
continuación.
[6,5,4,3,2,1]
[456,643,887,362,7378,589957,4,34557684,672,1]
[6,5,4,3,2,1]
[456,643,887,362,7378,589957,4,34557684,672,1]
79
Para un arreglo de tres elementos [3,2,1]
def sort(set_of_items)
…
end
sort([6,5,4,3,2,1])
def sort(set_of_items)
…
return set_of_items
end
81
fi
answer = sort([6,5,4,3,2,1])
print( answer)
Return
82
fi
fi
otantes, estructuras, etc.). Este proceso se realiza de la
siguiente manera:
84
fi
fi
5
MANEJO DE TIPOS DE DATOS
COMPUESTOS (ESTRUCTURAS DE
DATOS)
5.1 Conceptos sobre las estructuras de
datos
Una estructura de datos es la herramienta que permite
unir, organizar y manipular datos de uno o distintos tipos con
el objetivo de proveer un uso más e ciente y comprensible
de la información.
85
fi
fi
fi
5.1.1.1 Tamaño
Ejemplos: arreglos.
5.1.1.2 Procesamiento
86
fi
fi
herramientas permiten implementar estructuras manejando
múltiples tipos de datos.
5.2 Arreglos
Los arrays (en español como arreglos) son estructuras de
datos que utilizan la memoria del computador para
almacenar información del mismo tipo.
88
fi
fi
Ilustración 7. Arreglo multidimensional
Fuente: MathWorks
89
fi
fi
Ilustración 8. Arreglos bidimensionales
90
fi
inicializados, por lo que se muestra por defecto el valor de
nil.
El resultado es:
Forma #1
Forma #2
92
fi
fi
Observe que directamente se aplicó el concepto dado
para arreglos bidimensionales, y para mantener una
comprensión más amplía de la estructura y poderla ver como
una tabla se decidió por usar variables de row y col.
5.3 Listas
Las listas al igual que los arreglos son un conjunto de
elementos contiguos que bien pueden ser de igual o
distintos tipos. Es una estructura muy exible dentro de la
programación ya que siempre permite modi car su tamaño
en tiempo de ejecución.
93
fi
fl
fi
5.3.1 Listas desde un enfoque de la memoria de un
computador
94
fi
5.4 Ejemplos del uso de Listas y arreglos
Ruby internamente no di ere entre estos, en su lugar
pre ere tratar ambas bajo una misma de nición adoptando
características particulares de cada estructura, como lo es la
adaptación del tamaño proveniente las listas, y la
organización en memoria por parte de los arreglos.
95
fi
fi
fi
Desarrollo
Para el caso a se tiene el siguiente código
o también:
96
Nótese que se puede aplicar para cualquier tamaño de
lista, par o impar, por lo que para el caso de la lista
presentada en el código se tendría el siguiente resultado:
Desarrollo
97
fi
Al ejecutar el código anterior tenemos lo siguiente:
Desarrollo
98
fi
99
100
Al ejecutar el código anterior tenemos lo siguiente:
101
Las pilas manejan elementos de un solo tipo. Estos son
manipulados a través de los extremos de un conjunto total de
elementos, es decir, el primer y último elemento. De lo último,
se conocerá como TOS (Top of stack o tope de pila) al último
elemento, y al primero se le llamará FOS (Front of stack o
Frente de la pila).
5.5.2 Colas
5.6 Hashes
103
fi
fi
fi
Ilustración 12. Funcionamiento de datos en las tablas hash
104
Tabla 10. Operaciones fundamentales entre estructuras
105
fi
Tabla 11. Operaciones fundamentales de las pilas
Arreglos
Listas
Pilas y colas
Hashes
Todas estas comparten ciertas características, algunas en
los métodos que usan para manipular información como la
inserción y borrado de datos, algunos permiten búsqueda de
elementos mediante índices como sucede con los arreglos y
las listas, otros mediante la indicación de una llave como los
hashes. Por otra parte, cada uno se diferencia entre sí
teniendo en cuenta las siguientes características:
Los arreglos permiten almacenar un conjunto de
elementos del mismo tipo en un espacio de memoria
estático, esto quiere decir que debe ser especi cado al
momento de de nirlo.
108
fi
fi
6
LISTA DE ALGORITMOS MÁS
UTILIZADOS EN PROGRAMACIÓN
109
fi
fi
6.2 Características y clasi cación de los
algoritmos
Características
Clasi cación
111
fi
fi
6.3 Pseudocódigo
Utilizado para la descripción general de los algoritmos, es
un lenguaje de alto nivel, es decir que permite expresar ideas
en un lenguaje que sea altamente comprensible para el
humano más que para la computadora; este permite usar
conceptualmente estructuras vistas en la codi cación como
las iteraciones, condicionales, funciones, entre otras.
función esPrimo(númeroIngresado):
númeroDeDivisores = 0
por cada númeroEnAumento hasta el rango del
intervalo [1,númeroIngresado +1] hacer
si el númeroIngresado módulo
númeroEnAumento es igual a 0 entonces
sume uno a númeroDeDivisores
si el númeroDeDivisores es distinto de 2 y
el númeroIngresado es distinto de 1 entonces
retorne Falso
de lo contrario
retorne Verdadero
función main():
números = [datos aleatorios en un rango de 0
a 100]
113
Como resultado de su ejecución se puede obtener:
6.4.1.1 Concepto
114
fi
fi
6.4.1.2 Algoritmos de búsqueda no informados
C : conjunto de candidatos
Clen : longitud-tamaño del conjunto de
datos en C
S : solución
x : elemento perteneciente a C
S = 0
while (S != solución y Clen != 0) {
x = C[indice de elemento]
C = C – {x}
if (S {x} es factible) {
S = S∪{x}
115
fi
}
}
Monedas = {6, 3, 1, 4}
Valor : 23
Cambio : 6 6 6 4 1
[Note que el cambio [6 6 6 4 1] es el mínimo de
monedas de las cuales su suma da como resultado 23]
Valor : 13
Cambio: 6 6 1
[Note que el cambio [6 6 1 ] es el mínimo de monedas de
las cuales su suma da como resultado 13]
116
fi
Código
117
Como resultado se obtiene lo siguiente:
Su pseudocódigo es:
Si no:
Retornar un valor indicando
que el número a buscar
NO está en el conjunto de
datos
119
fi
Nota: Se deja a disposición del lector el formular el código
respectivo.
Su implementación es la siguiente:
120
El resultado del código anterior es:
121
6.4.2 Algoritmos de ordenamiento
[2,2,3,3,4,1,1,1,1,3,4,5,2,2,2,3]
122
El resultado obtenido es:
123
fi
Es necesario mencionar también que la complejidad de la
ejecución de este algoritmo depende del intervalo de
números utilizado, es decir, a mayor rango dentro del
intervalo de los elementos, mayor podría ser el tiempo que
se toma el algoritmo para ordenar el conjunto de elementos.
124
fi
Como se observa en la imagen, partiendo de un conjunto
de elementos s, se comienza a subdividir este último hasta
obtener partes compuestas por un solo elemento (las cuales
se consideran que ya están ordenadas). Posteriormente se
inicia la comparación entre parejas hasta lograr reagrupar el
conjunto, pero esta vez estando ordenado. Se debe resaltar
que el paso nal en donde se resultan dos mitades ya
ordenadas en sí mismas, estas podrán ser comparadas de
varias maneras, una de ellas es elemento por elemento.
125
fi
Ejecutando el código se obtiene lo siguiente:
126
6.4.2.3 Quick sort
127
fi
Ejecutando el código se obtiene lo siguiente:
128
6.5 Retroalimentación del capitulo
En este capítulo se analizaron los algoritmos, que son y
porque son tan importantes al momento de iniciar en la
programación. Por otra parte, se vieron otros aspectos
propios de este como la representación por pseudocódigo y
algunas de las clasi caciones de algoritmos más usados
actualmente.
129
fi
fi
fi
fi
7
POO (PROGRAMACIÓN ORIENTADA A
OBJETOS)
130
fi
fi
7.1 ¿Qué es la programación orientada a
objetos (POO)?
La programación orientada a objetos es la forma cómo se
puede escribir un código de manera tal que el programa que
se esté desarrollando pueda representar lo más el posible
una situación en especí co, es decir, intenta re ejar el
funcionamiento de un momento particular de la vida real. Un
ejemplo muy común de ello sería un programa que permita
manejar la contabilidad de una empresa de venta de
productos. Se entiende que allí participan personas como
vendedores, operarios, jefes, y contadores, estos últimos se
encargan de registrar las acciones realizadas por los
vendedores (quienes interactúan con los clientes) tales como
registrar una venta. De esta manera y más suceden un
conjunto de situaciones las cuales podrían ser planteadas
por medio de este modelo de programación.
131
fi
fi
fi
fl
entendería la clase como aquella clasi cación de elementos
que cumplen con ciertas características en común, pero que
cada elemento es diferenciable de otro. Por ejemplo, lo que
sucede con los moldes de galletas, si bien se pueden crear lo
que se conoce como galletas, una mezcla en su mayoría de
harina huevos y azúcar, cada una de estas puede tener
características distintas como su ancho y alto, las formas, e
inclusive el mismo contenido. Se obtienen en general
galletas, solo que cada una tiene características distintas.
133
fi
fi
aportar nutrientes, cambiar de forma a medida que son
ingeridas, preservarse en el tiempo modi cando ciertas
características, entre otras. De lo anterior se puede a rmar
entonces que los métodos describen las acciones de cada
objeto.
134
fi
fi
fi
fi
fi
en donde partiendo de esta clase inicial se pueden crear
otras que representan por ejemplo a los animales marinos,
terrestres, aéreos y an bios. Estos a su vez servirán para
clasi car nuevamente el término “animal” en casos
particulares. Mediante esta forma de relación se desarrollan
de una manera más clara los principios anteriores de
polimor smo y encapsulamiento.
● Principio de ocultación: se basa en aislar un objeto de
otros, esto para evitar accesos y cambios no permitidos. Esta
visión es más guiada hacia el desarrollo de código, más a
nivel práctico podría entenderse como que los objetos son
los únicos quienes pueden acceder directamente a sus
características. Por ejemplo, un animal ejerce la acción de
comer, cambiar su pelaje, mover las extremidades por su
propia cuenta. Por otra parte, si bien el acceso directo de
otros objetos o de cualquier otro individuo hacia los atributos
de otro está negado, se es permitido proveer información
acerca de ellos. Este concepto se podrá asimilar de una
mejor forma en los ejemplos de código posteriores.
7.2.3 Ejemplos
135
fi
fi
fi
fi
fi
7.2.3.2 De nición de atributos
136
fi
fi
fi
fi
fi
fi
fi
Nota: Las variables globales no serán ejempli cadas en
los ejemplos posteriores. Se deja a recomendación del lector.
137
fi
fi
Primero que todo, se decidió usar una función main() para
mantener allí el núcleo de ejecución de todo el código.
Segundo, la línea número 2 indica que se está creando un
nuevo objeto de la clase Animal con las características de
“Cat", "white", "Fish", "My house" y 2, es decir que se creará
un gato blanco que vive en una casa, come pescado y tiene
dos años, y que toda esa información será asignada a la
variable myAnimal1.
139
fi
fi
fi
fi
Para la clase usada como ejemplo se tendrían los
siguiente getters y setters:
140
fi
Observe que, de ahora en adelante, para poder acceder a
las características de nidas de un objeto se debe de usar un
punto después de la variable que almacena el objeto, luego
se escoge la característica a manipular. Observe por ejemplo
c ó m o s e a c c e d e a l a e d a d d e m yA n i m a l 1 c o n
myAnimal1.years.
141
fi
fi
fi
fi
fi
fi
142
Los nuevos métodos de nidos para la clase Animal son
animalWalk(), animalEat(), animalRun() y avoidCazadores(), a
la vez que se anexaron tres nuevos atributos a los cuales se
les de nió como herramienta de acceso la de tipo
attr_accesor, lo que permite conocer y actualizar el valor
almacenado en ellos.
143
fi
fi
Se puede observar el cambio de los atributos a medida
que se utilizan nuevos métodos. Por otra parte, se logra usar
la variable global de nida como $hunters por fuera de la
clase, dentro del último método llamado.
7.2.4.1 Herencia
144
fi
fi
El resultado de ejecutar el código anterior es:
145
fi
fi
herencia se logra de nir a un tipo de animal más especí co
que a su vez abarca un gran conjunto de elementos.
146
fi
fi
fi
fi
fi
fi
7.4 Retroalimentación del capitulo
147
fi
8
ANEXOS
Página Concepto
https://github.com/ Repositorio con códigos
MiguelALF12/recursos- utilizados en la lectura del libro
fundamentos-de-programacion-
con-ruby.git
visualising data structures Visualización de estructura
and algorithms through de datos y algoritmos mediante
animation - VisuAlgo animaciones
148
REFERENCIAS DE BIBLIOGRAFÍA Y
WEBGRAFÍA
Dane, M. (06 de 06 de 2018). Ruby programming
language.
Dave Thomas, C. F. (2004). Programming Ruby - The
Pragmatic Programmer's Guide. United states: Pragmatic
Programmers.
Seifer, J. (26 de 11 de 2014). teamtreehouse. Obtenido de
blog.teamtreehouse: https://blog.teamtreehouse.com/coolest-
ruby-projects-ever
Flanagan, D., & Matsumoto, Y. (2008). The Ruby
programming language: Everything you need to know.
California: O'Reilly Media Inc.
Olsen, R. (2011). Eloquent Ruby (Addison-Wesley
Professional Ruby Series). Manhattan: Pearson Education Inc.
J. Jones, P. (2015). E ective Ruby: 48 Speci c Ways to
Write Better Ruby. Estados Unidos: Pearson Education Inc.
Fitzgerald, M. (2015). Ruby Pocket Reference: Instant help
for ruby programmers. California: O'Reilly Media Inc.
A. Shaw, Z. (2015). LEARN RUBY THE HARD WAY THIRD
EDITION. Pearson Education Inc.
Shaughnessy, P. (2013). Ruby under a microscope: An
Illustrated Guide to Ruby Internals. No Starch Press.
Carlson, L., & Richardson, L. (2015). Ruby Cookbook:
Recipes for Object-Oriented Scripting. O'Reilly Media Inc.
T. Brown, G. (2009). Ruby Best Practices:Increase Your
Productivity - Write Better Code. O'Reilly Media Inc.
A. Black, D., & Leo III, J. (2019). The Well-Grounded
Rubyist. Manning.
Wikipedia. (17 de 07 de 2022). Wikipedia the free
encyclopedia. Obtenido de Algoritmo: https://
es.wikipedia.org/wiki/Algoritmo
149
ff
fi
Wikipedia. (14 de 07 de 2022). Wikipedia the free
encyclopedia. Obtenido de Ruby (programming language):
https://en.wikipedia.org/wiki/Ruby_(programming_language)
ruby-doc.org. (s.f.). ruby-doc. Obtenido de ruby-doc.org:
https://ruby-doc.org/core-3.0.1/doc
Castello, J. (Marzo de 2015). rubyguides. Obtenido de
https://www.rubyguides.com/2015/03/caesar-cipher-in-ruby/
kalkicode. (20 de Septiembre de 2021). Obtenido de
https://kalkicode.com/coin-change-using-greedy-algorithm-in-
ruby
Megan. (25 de Abril de 2020). DEV. Obtenido de https://
d e v. t o / m w o n g 0 6 8 / m e r g e - s o r t - i n -
ruby-28n1#:~:text=Merge%20Sort%20in%20Ruby%201%20Ov
erview.%20If%20you%27ve,...%203%20Actual%20Code.
%20...%204%20Resources.%20
150