Ruby: El Lenguaje de la Felicidad
Aprende Ruby y Rails para desarrollo web elegante y productivo
1 Cargando...
Ruby: El Lenguaje de la Felicidad
Ruby es un lenguaje de programación dinámico, de código abierto, enfocado en simplicidad y productividad. Creado por Yukihiro “Matz” Matsumoto en 1995 en Japón, Ruby fue diseñado para hacer felices a los programadores, con una sintaxis natural que se lee casi como inglés.
Filosofía Ruby: “Ruby está diseñado para hacer felices a los programadores.” - Matz. Esta filosofía se refleja en cada aspecto del lenguaje.
Características Distintivas
- Todo es un Objeto - Incluso números y booleanos son objetos
- Bloques y Procs - Closures poderosas y elegantes
- Metaprogramación - Código que escribe código
- Duck Typing - Si camina como pato y hace quack…
- DSLs - Facilidad para crear Domain Specific Languages
- Ruby on Rails - Framework que revolucionó el desarrollo web
Fundamentos
Tipos y Variables
# Variables locales
nombre = "María"
edad = 25
altura = 1.68
activo = true
# Símbolos (inmutables y únicos)
estado = :pendiente
rol = :admin
# Arrays
frutas = ["manzana", "banana", "naranja"]
frutas << "uva" # Añade
frutas.push("fresa")
# Hashes
usuario = {
nombre: "María",
email: "[email protected]",
edad: 25
}
# Acceso
usuario[:nombre] # "María"
usuario.fetch(:telefono, "No proporcionado")
# Rangos
numeros = (1..10)
letras = ("a".."z")
numeros.to_a # [1, 2, 3, ..., 10]
# String interpolation
mensaje = "¡Hola, #{nombre}! Tienes #{edad} años."
Métodos y Bloques
# Método simple
def saludar(nombre)
"¡Hola, #{nombre}!"
end
# Método con valor por defecto
def crear_usuario(nombre, email, activo: true)
{ nombre: nombre, email: email, activo: activo }
end
# Método con bloque
def ejecutar_con_log
puts "Iniciando..."
resultado = yield
puts "Finalizando..."
resultado
end
ejecutar_con_log { 2 + 2 } # Retorna 4
# Bloques con parámetros
[1, 2, 3].map { |n| n * 2 } # [2, 4, 6]
# Procs y Lambdas
duplicar = ->(x) { x * 2 }
duplicar.call(5) # 10
# Method chaining
resultado = [1, 2, 3, 4, 5]
.select { |n| n.even? }
.map { |n| n * 2 }
.sum
Clases y Objetos
# Clase básica
class Usuario
attr_reader :id, :email
attr_accessor :nombre
def initialize(nombre, email)
@id = SecureRandom.uuid
@nombre = nombre
@email = email
@activo = true
end
def saludar
"¡Hola, #{@nombre}!"
end
def activo?
@activo
end
def desactivar!
@activo = false
end
end
# Herencia
class Admin < Usuario
attr_reader :permisos
def initialize(nombre, email, permisos = [])
super(nombre, email)
@permisos = permisos
end
def puede?(accion)
permisos.include?(accion.to_sym)
end
end
# Módulos (mixins)
module Timestamps
def touch
@updated_at = Time.now
end
def created_at
@created_at ||= Time.now
end
end
class Articulo
include Timestamps
def initialize(titulo)
@titulo = titulo
end
end
Enumerables
numeros = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# Transformaciones
doblados = numeros.map { |n| n * 2 }
pares = numeros.select { |n| n.even? }
impares = numeros.reject { |n| n.even? }
# Reducciones
suma = numeros.reduce(0) { |acc, n| acc + n }
suma = numeros.sum # Atajo
# Búsquedas
primer_par = numeros.find { |n| n.even? }
todos_pares = numeros.all? { |n| n.even? }
algun_par = numeros.any? { |n| n.even? }
# Agrupamiento
grupos = numeros.group_by { |n| n.even? ? :par : :impar }
# Ordenación
usuarios = [
{ nombre: "María", edad: 25 },
{ nombre: "Juan", edad: 30 },
{ nombre: "Ana", edad: 22 }
]
ordenados = usuarios.sort_by { |u| u[:edad] }
mas_viejo = usuarios.max_by { |u| u[:edad] }
Ruby on Rails Esencial
# Model con validaciones
class Usuario < ApplicationRecord
has_many :posts, dependent: :destroy
belongs_to :empresa
validates :nombre, presence: true, length: { minimum: 2 }
validates :email, presence: true, uniqueness: true
scope :activos, -> { where(activo: true) }
scope :admins, -> { where(rol: :admin) }
end
# Controller RESTful
class UsuariosController < ApplicationController
before_action :set_usuario, only: [:show, :update, :destroy]
def index
@usuarios = Usuario.activos.includes(:empresa)
render json: @usuarios
end
def create
@usuario = Usuario.new(usuario_params)
if @usuario.save
render json: @usuario, status: :created
else
render json: { errors: @usuario.errors }, status: :unprocessable_entity
end
end
private
def set_usuario
@usuario = Usuario.find(params[:id])
end
def usuario_params
params.require(:usuario).permit(:nombre, :email, :empresa_id)
end
end
Herramientas Esenciales
| Herramienta | Propósito |
|---|---|
| Bundler | Gestor de dependencias |
| Rails | Framework web full-stack |
| RSpec | Framework de tests |
| Rubocop | Linter y formateador |
| Pry | Consola interactiva avanzada |
Lista de Verificación de Aprendizaje
- Dominar bloques, procs y lambdas
- Entender módulos y mixins
- Aprender métodos Enumerable
- Estudiar metaprogramación
- Practicar con Ruby on Rails
- Escribir tests con RSpec
- Crear una API REST
Recursos Esenciales
Cita
“Ruby es simple en apariencia, pero muy complejo por dentro, como el cuerpo humano.” - Yukihiro Matsumoto
¡Ruby hace que la programación sea una experiencia placentera. Descubre la felicidad de programar con Ruby!