Introducción a Ruby

izakntun

Isaac Cantún

Posted on May 13, 2020

Introducción a Ruby

Tabla de contenido

  1. Introducción
  2. ¿Qué es Ruby?
  3. Sintaxis básica
  4. Condicionales
  5. Arrays y Hashes
  6. Estructuras de control (ciclos)
  7. Fin :(

Introducción

¡hola a todos! he vuelto con un nuevo artículo, en esta última semana estuve leyendo sobre un lenguaje de programación, el cual nunca había tenido ningún acercamiento, no conocía su sintaxis (solo sabía que era muy parecido a Python), no conocía frameworks escritos con él, en pocas palabras no me había interesado por aprenderlo, sin embargo leyendo en Twitter y en LinkedIn que muchas empresas lo usan, me dio mucha curiosidad y comencé a ver algunos videos y a leer algunos libros y artículos que encontré y la verdad me atrapó, el lenguaje del que hablo es Ruby, y bien la idea de escribir una serie de tutoriales sobre el es porque aún lo estoy aprendiendo y quiero compartir todo lo que pueda aprender y todos aprendamos juntos, voy a omitir la instalación de Ruby ya que realmente es bastante sencilla y creo que tomando 5 minutos en Google puedes lograr instalarlo sin problemas.

¿Qué es Ruby?

Antes de entrar en tema de sintaxis quiero mostrarte lo que la página oficial dice de Ruby:

Ruby es...

Un lenguaje de programación dinámico y de código abierto enfocado en la simplicidad y productividad. Su elegante sintaxis se siente natural al leerla y fácil al escribirla.

También se dice que Ruby es el lenguaje de las grandes Startups, si haz utilizado Python te sentirás familiarizado con la sintaxis de Ruby, ya que de cierto modo son parecidos, Ruby es un lenguaje de tipado dinámico, lo que quiere decir que no necesitarás declarar un tipo de dato cuando declaras una variable o definir un tipo de dato de retorno en las funciones como en otros lenguajes de tipado estático como Java o C#, entonces vamos a comenzar con las variables y tipos de datos en Ruby.

Sintaxis básica

Antes de comenzar vamos a crear un archivo con el nombre que tu quieras en la carpeta que tu desees, yo lo pondré en mi workspace y lo llamare intro.rb, OJO .rb es la extensión que deben tener los archivos de Ruby y así el interprete pueda ejecutarlos.

Bueno para comenzar no hay trucos, las variables en Ruby se definen escribiendo el nombre y su valor asignándolo con el signo de = de la siguiente manera:

name = 'John'
last_name = 'Doe'
age = 30
Enter fullscreen mode Exit fullscreen mode

Si bien nuestro ejemplo es muy básico, creo que podemos hacer algunas observaciones, la primera es que Ruby es indiferente a las comillas simples o las comillas dobles, sin embargo se recomienda que estandarices las que vayas a usar en tu código y no que las combines, segunda observación es que a diferencia de otros lenguajes Ruby recomienda usar snake_case para variables y funciones, y CamelCase solo para nombres de clases, algo muy parecido a lo que recomienda la comunidad de Python, para continuar podemos imprimir en pantalla las variables de la siguiente manera:

puts "Mi nombre es #{name} #{last_name} y tengo #{age} años"
Enter fullscreen mode Exit fullscreen mode

Si desde nuestra terminal ejecutamos ruby intro.rb podemos observar la siguiente salida:

Mi nombre es John Doe y tengo 30 años
Enter fullscreen mode Exit fullscreen mode

Vamos a detenernos a explicar lo que acaba de ocurrir, bien la palabra reservada puts realmente es un método en Ruby, podemos o no escribirlo con paréntesis (puts()) sin embargo en documentación y otros ejemplos en internet difícilmente lo encontrarás con paréntesis, porque en Ruby es común escribirlo así como lo hicimos, lo segundo que podemos observar es algo que muchos lenguajes ya han incorporado y es la interpolación de cadenas con Ruby usamos esta sintaxis "#{variable}" para imprimir contenido dinámico en un string sin necesidad de concatenarlo, y si eres un poco observador, te darás cuenta que esta vez usamos comillas dobles, y es que esto tiene un propósito, la interpolación de cadenas solo se puede hacer con comillas dobles, ya que las comillas simples imprimirán el contenido de la cadena tal cual lo escribimos y eso incluye nuestra sintaxis para la interpolación.

Ahora vamos a ver las constantes, podemos definir constantes en Ruby simplemente con poner el nombre de la "variable" en mayúsculas, de esta forma el interprete de Ruby entenderá que el valor asignado a la constante nunca cambiará, por ejemplo:

BIRTHDAY = Time.new(1992, 07, 24)
Enter fullscreen mode Exit fullscreen mode

De esta forma hemos declarado una constante BIRTHDAY con nuestra fecha de cumpleaños, si la reasignamos, obtendremos el siguiente warning en la consola warning: previous definition of BIRTHDAY was here este nos avisará que la constante ya fue asignada, la clase Time como en todo lenguaje de programación existe una clase para manejar fechas y horas y en este tutorial no vamos a profundizar en esta clase.

Existen muchos detalles que no considero tan relevantes en un tutorial como este si es que ya conoces de programación, ya que no es un tutorial de fundamentos de programación sino de Ruby, así que los mencionaré muy rápidamente, por ejemplo los tipos de datos que tenemos en ruby son int como 100, los float como 100.0, boolean como true o false entre otros que tenemos disponibles en la mayoría de los lenguajes, en Ruby todo es un objeto y por ende cada tipo de dato tiene muchos métodos a los cuales se pueden acceder, te invito a que los explores, por ejemplo si quieres saber que métodos corresponden a la clase String puedes hacer lo siguiente:

puts "una cadena cualquiera".methods
Enter fullscreen mode Exit fullscreen mode

Y de esta manera puedes comprobarlo con cualquier tipo de dato, recuerda todo en Ruby es un objeto y por lo tanto todo tiene métodos a los que podemos acceder. Otro detalle poco relevante pero que es bueno que lo sepas es que existen 3 métodos para imprimir en consola, print, puts y p, puedes experimentar con ellos y ver sus diferencias que no son muchas.

Bien otro detalle interesante que aprendí de Ruby, la entrada datos por el usuario y como hacemos esto, muy fácil:

print "dame tu nombre: "
nombre = gets.chomp
puts "Mucho gusto #{nombre}"
Enter fullscreen mode Exit fullscreen mode

Te explico en la primera línea usamos print porque puts nos agrega un salto de línea y print no hace eso, segundo gets captura lo que el usuario escriba en la terminal, gets también agrega un salto de línea, y eso aunque sea invisible nos agrega un caracter más que no necesitamos, para eliminarlo utilizamos chomp, como puedes ver en el ejemplo podemos asignar la entrada del usuario a una variable e imprimirla.

Condicionales

Vamos a ver los condicionales en Ruby, la sintaxis es muy sencilla y de nuevo comparando con Python son muy parecidos, en este momento vamos a entrar a una característica del lenguaje que son los bloques de código, pero ¿cómo definimos un bloque de código? con el condicional if lo miraremos:

if true 
  puts 'es verdadero!'
end
Enter fullscreen mode Exit fullscreen mode

Así de simple es Ruby, delimitamos el final de un bloque de código a través de la palabra reservada end, rápidamente otra característica del lenguaje son los operadores lógicos que de igual manera como en otros lenguajes son, and (&&), or (||) not (!), puedes usar los símbolos que están entre paréntesis o las palabras reservadas, vamos al código:

#con palabras reservadas
falso = false
verdadero = true

if not falso and verdadero or true
  puts 'es falso! o verdadero? O.o'
end

#con simbolos
falso = false
verdadero = true

if !falso && verdadero || true
  puts 'es falso! o verdadero? O.o'
end

Enter fullscreen mode Exit fullscreen mode

La salida es la misma sin embargo los símbolos tienen mayor procedencia, un detalle en este ejemplo es este símbolo #, el cual usamos para hacer comentarios en la misma línea, continuando con las condiciones todo if podría tener un else y se ve de la siguiente manera:

if 10 < 1
  puts 'si es'
else
  puts 'no es'
end
Enter fullscreen mode Exit fullscreen mode

Y también podría tener un sino o elsif, si así se escribe elsif:

if 10 < 1
  puts 'si es menor que 1'
elsif 10 > 5
  puts 'si es mayor que 5'
else
  puts 'no es'
end
Enter fullscreen mode Exit fullscreen mode

Como puedes ver las condiciones y los operadores lógicos en Ruby son muy simple, para terminar con la parte de condicionales, vamos a ver muy rápidamente el condicional case:

dia = 8

case dia
when 1
  puts 'es lunes'
when 2
  puts 'es martes'
when 3
  puts 'miercoles'
when 4
  puts 'es jueves'
when 5
  puts 'es viernes'
else
  puts 'es fin de semana'
end
Enter fullscreen mode Exit fullscreen mode

Y unless:

unless !true
  puts 'es falso'
else
  puts 'es verdadero'
end
Enter fullscreen mode Exit fullscreen mode

unless es exactamente lo opuesto a if, es la negación de if, puedes experimentar con los condicionales e ir probándolos y descubriendo su funcionamiento.

Arrays y Hashes

Antes de comenzar a hablar de las estructuras de control, vamos a ver dos estructuras de datos las cuales vamos a ocupar para trabajar con ciclos, bien estos son los arrays y los hashes, vamos a empezar rápidamente con los array, como en otros lenguajes son colecciones de información que pueden ser de cualquier tipo de dato, por ejemplo:

arr = [1,2,4,true,'string']
puts arr
Enter fullscreen mode Exit fullscreen mode

Los hashes son diccionarios osea que son estructuras de tipo clave-valor, un ejemplo sería el siguiente:

dict = {
  'clave' => 'valor',
  'otra clave' => 'otro valor'
}

puts dict
Enter fullscreen mode Exit fullscreen mode

Algo que me gustaría mucho mencionar sobre los hashes, es que existe una sintaxis especial sobre las cadenas, de hecho esta sintaxis es muy usada con los hashes, y esta sintaxis lleva el nombre de symbols, esta solo pueden ser aplicadas a cadenas de una sola palabra osea que no tienen espacios, por ejemplo:

dict = {
  :clave => 'valor',
  :otra_clave => 'otro valor'
}

puts dict
Enter fullscreen mode Exit fullscreen mode

Tenemos otra manera de escribir los hashes y es la siguiente:

dict = {
  clave: 'valor',
  otra_clave: 'otro valor'
}

puts dict
Enter fullscreen mode Exit fullscreen mode

También son symbols pero con una sintaxis diferente, son como los diccionarios en Python.

Bien rápidamente, los symbols, hacen referencia a un solo objeto o mejor dicho al mismo lugar en memoria, y muchas veces trabajar con symbols es mas eficiente que las cadenas y el mejor ejemplo es trabajar con ellos en los hashes, las claves debería ser symbols y no strings, para demostrar que se trata del mismo objeto (recuerda en Ruby todo es un objeto) podemos hacer lo siguiente:

puts 'hola'.object_id
puts 'hola'.object_id
puts :hola.object_id
puts :hola.object_id
Enter fullscreen mode Exit fullscreen mode

Nuestra consola arrojará el siguiente resultado, porque aunque los strings son los mismos, se crea un objeto diferente por cada uno, en cambio los symbols siempre apuntan al mismo:

42140380
42140240
1102428
1102428
Enter fullscreen mode Exit fullscreen mode

Para terminar solo nos falta ver como accedemos a los elementos de un array y de un hash y esto es muy sencillo:

#accediendo al valor de un hash
dict = {
  clave: 'valor',
  otra_clave: 'otro valor'
}

puts dict[:clave]

#accediendo al valor de un array por medio de su índice
arr = [1,2,4,true,'string']
puts arr[4]
Enter fullscreen mode Exit fullscreen mode

Como podemos ver es muy sencillo trabajar con estas estructuras de datos y nos serán muy útiles para trabajar con ciclos.

Estructuras de control (ciclos)

Bien ahora si vamos directo a las estructuras de control, y la primera que vamos a explorar será el ciclo for, supongamos que tenemos el siguiente array: colores = ['rojo', 'azul', 'verde', 'amarillo', 'negro', 'blanco'], podemos hacer un puts o podemos recorrerlo de la siguiente manera:

colores = ['rojo', 'azul', 'verde', 'amarillo', 'negro', 'blanco']

for color in colores
  puts color
end
Enter fullscreen mode Exit fullscreen mode

Así de simple, así de sencillo, sin más complicaciones hemos recorrido nuestro array, pero Ruby nos provee otras formas, por ejemplo:

colores = ['rojo', 'azul', 'verde', 'amarillo', 'negro', 'blanco']

colores.each do |color|
  puts color
end
Enter fullscreen mode Exit fullscreen mode

Prácticamente es una manera de hacer un ciclo de manera funcional, recuerda que en Ruby TODO es un objeto, de modo que los array y los hash también tienen métodos que pueden ser aplicados a ellos, para terminar con el ciclo for vamos a ver un ejemplo de como recorrer un hash:

autos_colores = {
  nissan: 'rojo',
  chevrolet: 'azul',
  volkswagen: 'verde',
  susuki: 'amarillo',
  ford: 'negro',
  kia: 'blanco'
}

autos_colores.each do |key, value|
  puts "El auto #{key} es de color #{value}"
end
Enter fullscreen mode Exit fullscreen mode

Por último en este artículo, vamos a ver el ciclo while, su modificador o "do while" y el ciclo ùntil:

numero = 1

while numero <= 5
  puts 'en ejecucion'
  numero += 1
end
Enter fullscreen mode Exit fullscreen mode

El ciclo while es muy sencillo sin embargo, existe un modificador para este ciclo, que hace la función de do while en otros lenguajes, vamos a ello:

begin 
  puts 'en ejecucion'
end while 1 > 10
Enter fullscreen mode Exit fullscreen mode

La condición NO es verdadera pero de igual manera que do while, la instrucción se ejecuta una sola ves, después se evalúa la condición y al ser false se sale del ciclo. Por último y muy rápidamente vamos a ver el ciclo until:

numero = 1

until numero > 5
  puts 'en ejecucion'
  numero += 1
end
Enter fullscreen mode Exit fullscreen mode

Si notas su función, así como unless es la negación de if, until es la negación del while, ya que until se va a ejecutar mientras la condición sea falsa, cuando la condición se evalúe como verdadera el ciclo se termina.

Fin :(

Como pudiste ver Ruby es un lenguaje, muy simple, súper expresivo, muy divertido y sobre todo "fácil" de aprender, NO abarcamos funciones, clases, métodos de clases, atributos etc... Porque podemos utilizarlo para un artículo posterior, y también conforme siga adentrándome a este maravilloso lenguaje podemos seguir compartiendo conocimiento, sin embargo esta introducción ha sido bastante buena y productiva, insisto acabo de empezar a aprenderlo y si tu ya sabes Ruby y consideras que algo de lo que escribí es incorrecto, con toda confianza envíame un mensaje, porque no solo busco compartir información, sino también aprenderla bien, esta serie de artículos serán como una especie de diario, la cual irá creciendo a medida que siga aprendiendo más sobre Ruby y descubriendo algunos trucos que nos harán más productivos y mejores programadores. Hasta la próxima, nos vemos pronto.

💖 💪 🙅 🚩
izakntun
Isaac Cantún

Posted on May 13, 2020

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related