0Pricing
Ruby Academy · Lección

Escritura de un each personalizado

Implemente la iteración

Escritura de un each personalizado es una lección gratuita de Ruby Academy en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Ruby Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Ruby Academy incluye 4 lecciones en total.

Implementar la iteración

La iteración de Ruby gira en torno a un método: each. Al escribir su propio each, decide cómo se recorre una colección y desbloquea todo el ecosistema de iteración.

class Trio
  def each
    yield 1
    yield 2
    yield 3
  end
end
Trio.new.each { |n| puts n }

each produce valores

Dentro de each, llame a yield una vez por elemento. El bloque que proporciona quien llama recibe cada valor por turnos.

class Days
  NAMES = ["Mon", "Tue", "Wed"]
  def each
    NAMES.each { |d| yield d }
  end
end
Days.new.each { |day| puts day }

Almacenar datos internos

Normalmente, each recorre los datos almacenados en una variable de instancia.

class Stack
  def initialize
    @items = []
  end
  def push(x); @items << x; self; end
  def each
    @items.each { |i| yield i }
  end
end
s = Stack.new
s.push(10).push(20)
s.each { |x| puts x }

Orden de recorrido personalizado

Su each puede iterar en el orden que prefiera, por ejemplo, en orden inverso.

class Reversed
  def initialize(arr); @arr = arr; end
  def each
    i = @arr.length - 1
    while i >= 0
      yield @arr[i]
      i -= 1
    end
  end
end
Reversed.new([1, 2, 3]).each { |x| puts x }

Producir varios valores

yield puede pasar más de un valor, que el bloque recibe como varios parámetros, como la clave y el valor de un hash.

class Pairs
  def each
    yield :a, 1
    yield :b, 2
  end
end
Pairs.new.each { |key, value| puts "#{key}=#{value}" }

each devuelve self

Por convención, each devuelve la propia colección para que las llamadas se puedan encadenar. Devolver self desde each coincide con el comportamiento integrado.

class Box
  def initialize(*x); @x = x; end
  def each
    @x.each { |i| yield i }
    self
  end
end
result = Box.new(1, 2).each { |i| }
puts result.class

Usar block_given?

Evite que falte el bloque para que un each sin bloque no provoque un error, normalmente devolviendo un enumerador, que se explicará más adelante.

class List
  def initialize(*x); @x = x; end
  def each
    return @x.to_enum unless block_given?
    @x.each { |i| yield i }
  end
end
puts List.new(5, 6).each.class

Impulsar otros métodos

Una vez que existe each, puede crear otros métodos basados en él dentro de la misma clase.

class Numbers
  def initialize(*n); @n = n; end
  def each; @n.each { |i| yield i }; end
  def total
    sum = 0
    each { |i| sum += i }
    sum
  end
end
puts Numbers.new(1, 2, 3, 4).total

Secuencias calculadas

each no tiene por qué almacenar nada; puede generar valores sobre la marcha.

class Evens
  def initialize(limit); @limit = limit; end
  def each
    n = 0
    while n <= @limit
      yield n
      n += 2
    end
  end
end
Evens.new(8).each { |x| puts x }

La base de Enumerable

Su each es el único componente básico que necesita Enumerable. En la próxima lección lo incluirá y obtendrá decenas de métodos de forma gratuita.

class Range3
  def each
    (1..3).each { |n| yield n }
  end
end
Range3.new.each { |n| print n }
puts

Cómo encaja todo

Un each personalizado le proporciona control total sobre la iteración:

  • yield una vez por elemento.
  • Recorra en cualquier orden, genere valores o produzca pares.
  • Devuelva self por convención.
class Countdown
  def initialize(from); @from = from; end
  def each
    @from.downto(1) { |n| yield n }
  end
end
Countdown.new(3).each { |n| puts n }

Comprobación rápida

Compruebe cuánto entiende del método each personalizado.

Resumen

Ha aprendido a escribir un each personalizado:

  • yield pasa elementos al bloque de quien llama.
  • Usted controla el orden de recorrido y puede generar valores.
  • Devuelva self por convención.
  • each es la base de Enumerable.
class Squares
  def initialize(n); @n = n; end
  def each
    (1..@n).each { |i| yield i * i }
  end
end
Squares.new(4).each { |sq| puts sq }

Preguntas frecuentes

¿La lección «Escritura de un each personalizado» es gratis?

Sí — el texto completo de «Escritura de un each personalizado» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Ruby Academy, actualiza a CoddyKit PRO. El curso de Ruby Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Escritura de un each personalizado»?

Implemente la iteración Practicas Ruby Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Ruby Academy?

No se requiere experiencia previa. Ruby Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.

¿Cuánto tiempo toma la lección «Escritura de un each personalizado»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Ruby Academy?

Sí. Cada lección de Ruby Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Escritura de un each personalizado
  2. Inclusión de Enumerable
  3. Enumeradores perezosos
  4. Objetos Enumerator
← Volver a Ruby Academy