En Ruby, los iteradores son métodos que permiten recorrer colecciones de datos como arrays y hashes de manera eficiente y elegante. Los iteradores son una parte fundamental del lenguaje y se utilizan ampliamente para realizar operaciones repetitivas sobre colecciones.

Conceptos Clave

  1. Iteradores Básicos: each, map, select, reject, reduce.
  2. Bloques: Código que se pasa a los iteradores para que se ejecute en cada elemento de la colección.
  3. Enumerables: Módulo que proporciona métodos iterativos a las clases que incluyen este módulo.

Iteradores Básicos

each

El iterador each es uno de los más comunes y se utiliza para recorrer cada elemento de una colección.

# Ejemplo con un array
[1, 2, 3, 4, 5].each do |num|
  puts num
end

# Ejemplo con un hash
{a: 1, b: 2, c: 3}.each do |key, value|
  puts "#{key}: #{value}"
end

map

El iterador map se utiliza para transformar cada elemento de una colección y devolver un nuevo array con los resultados.

# Ejemplo con un array
squared_numbers = [1, 2, 3, 4, 5].map do |num|
  num ** 2
end
puts squared_numbers.inspect  # => [1, 4, 9, 16, 25]

select

El iterador select se utiliza para filtrar elementos de una colección que cumplen con una condición específica.

# Ejemplo con un array
even_numbers = [1, 2, 3, 4, 5].select do |num|
  num.even?
end
puts even_numbers.inspect  # => [2, 4]

reject

El iterador reject es lo opuesto a select; filtra elementos que no cumplen con una condición específica.

# Ejemplo con un array
odd_numbers = [1, 2, 3, 4, 5].reject do |num|
  num.even?
end
puts odd_numbers.inspect  # => [1, 3, 5]

reduce

El iterador reduce (también conocido como inject) se utiliza para acumular todos los elementos de una colección en un solo valor.

# Ejemplo con un array
sum = [1, 2, 3, 4, 5].reduce(0) do |accumulator, num|
  accumulator + num
end
puts sum  # => 15

Bloques

Los bloques son fragmentos de código que se pasan a los métodos iteradores. Pueden ser definidos utilizando do...end o llaves {...}.

# Usando do...end
[1, 2, 3].each do |num|
  puts num
end

# Usando llaves
[1, 2, 3].each { |num| puts num }

Enumerables

El módulo Enumerable proporciona una colección de métodos iterativos que pueden ser incluidos en clases como Array y Hash.

# Ejemplo de uso del módulo Enumerable
class CustomCollection
  include Enumerable

  def initialize(collection)
    @collection = collection
  end

  def each(&block)
    @collection.each(&block)
  end
end

custom_collection = CustomCollection.new([1, 2, 3, 4, 5])
puts custom_collection.map { |num| num * 2 }  # => [2, 4, 6, 8, 10]

Ejercicios Prácticos

Ejercicio 1: Uso de each

Escribe un programa que imprima cada elemento de un array de nombres.

nombres = ["Ana", "Luis", "Pedro", "María"]
nombres.each do |nombre|
  puts nombre
end

Ejercicio 2: Uso de map

Escribe un programa que tome un array de números y devuelva un nuevo array con cada número multiplicado por 10.

numeros = [1, 2, 3, 4, 5]
numeros_por_diez = numeros.map do |num|
  num * 10
end
puts numeros_por_diez.inspect  # => [10, 20, 30, 40, 50]

Ejercicio 3: Uso de select

Escribe un programa que filtre los números impares de un array.

numeros = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
numeros_impares = numeros.select do |num|
  num.odd?
end
puts numeros_impares.inspect  # => [1, 3, 5, 7, 9]

Ejercicio 4: Uso de reduce

Escribe un programa que calcule el producto de todos los números en un array.

numeros = [1, 2, 3, 4, 5]
producto = numeros.reduce(1) do |acc, num|
  acc * num
end
puts producto  # => 120

Conclusión

En esta sección, hemos explorado los iteradores en Ruby, que son herramientas poderosas para trabajar con colecciones de datos. Hemos aprendido sobre los iteradores básicos como each, map, select, reject y reduce, así como el uso de bloques y el módulo Enumerable. Estos conceptos son fundamentales para escribir código Ruby eficiente y elegante. En la próxima sección, profundizaremos en la programación orientada a objetos en Ruby.

© Copyright 2024. Todos los derechos reservados