0Pricing
Ruby Academy · Lección

Comparable y Enumerable

Mixins estándar

Comparable y Enumerable es una lección gratuita de Ruby Academy en CoddyKit. Esta es la lección 3 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.

Mixins estándar

Ruby incluye módulos potentes que puede mezclar en sus propias clases. Dos destacados son Comparable y Enumerable. Cada uno le proporciona muchos métodos a cambio de implementar solo uno.

puts Comparable.instance_methods.sort.inspect

Comparable necesita <=>

Comparable requiere que defina el operador nave espacial <=>, que devuelve -1, 0 o 1. A cambio, obtiene <, <=, ==, >, >= y between?.

class Weight
  include Comparable
  attr_reader :grams
  def initialize(g); @grams = g; end
  def <=>(other); grams <=> other.grams; end
end
puts Weight.new(50) < Weight.new(80)

Métodos de comparación incluidos

Al definir un solo operador, todos los métodos de comparación funcionan automáticamente.

class Weight
  include Comparable
  attr_reader :grams
  def initialize(g); @grams = g; end
  def <=>(other); grams <=> other.grams; end
end
a = Weight.new(100)
b = Weight.new(100)
puts a == b
puts Weight.new(30).between?(Weight.new(10), Weight.new(50))

clamp de Comparable

Comparable también proporciona clamp, que mantiene un valor dentro de un intervalo.

puts 15.clamp(0, 10)
puts (-5).clamp(0, 10)
puts 7.clamp(0, 10)

Ordenar objetos Comparable

Dado que se ha definido <=>, un array de sus objetos se puede ordenar automáticamente.

class Weight
  include Comparable
  attr_reader :grams
  def initialize(g); @grams = g; end
  def <=>(other); grams <=> other.grams; end
  def to_s; "#{grams}g"; end
end
list = [Weight.new(30), Weight.new(10), Weight.new(20)]
puts list.sort.map(&:to_s).inspect

Enumerable necesita each

Enumerable requiere que defina each. A cambio, obtiene map, select, reduce, min, max, sort y muchas más opciones.

class TodoList
  include Enumerable
  def initialize(*items); @items = items; end
  def each(&block); @items.each(&block); end
end
list = TodoList.new("buy milk", "call mom")
puts list.map(&:upcase).inspect

Agregación sin coste

Una vez definido each, tiene disponibles métodos de agregación como count, min e include?.

class Scores
  include Enumerable
  def initialize(*n); @n = n; end
  def each(&block); @n.each(&block); end
end
s = Scores.new(8, 3, 9, 4)
puts s.max
puts s.min
puts s.count

select y reject

También se incluyen métodos de filtrado.

class Numbers
  include Enumerable
  def initialize(*n); @n = n; end
  def each(&block); @n.each(&block); end
end
nums = Numbers.new(1, 2, 3, 4, 5, 6)
p nums.select(&:even?)
p nums.reject(&:even?)

reduce para obtener totales

reduce (alias inject) combina elementos, por ejemplo, para sumarlos.

class Basket
  include Enumerable
  def initialize(*p); @p = p; end
  def each(&block); @p.each(&block); end
end
b = Basket.new(10, 20, 30)
puts b.reduce(0) { |sum, price| sum + price }

Combine ambos mixins

Añada Comparable para ordenar y Enumerable para iterar, y su clase se comportará como una colección integrada.

class Playlist
  include Enumerable
  def initialize(*songs); @songs = songs; end
  def each(&block); @songs.each(&block); end
end
pl = Playlist.new("c", "a", "b")
puts pl.sort.inspect
puts pl.first

Cómo encaja todo

Los mixins estándar recompensan un contrato mínimo:

  • Comparable: defina <=> y obtenga todas las comparaciones.
  • Enumerable: defina each y obtenga todo el conjunto de herramientas para colecciones.
class Bag
  include Enumerable
  def initialize(*x); @x = x; end
  def each(&b); @x.each(&b); end
end
puts Bag.new(3, 1, 2).sort.inspect

Comprobación rápida

Compruebe cuánto entiende de los mixins estándar.

Resumen

Ha aprendido sobre los mixins estándar:

  • Comparable necesita <=> y proporciona comparación, clamp y between?.
  • Enumerable necesita each y proporciona map, select, reduce, min, max y mucho más.
  • Juntos hacen que las clases personalizadas se comporten como clases nativas.
class Temp
  include Comparable
  attr_reader :deg
  def initialize(d); @deg = d; end
  def <=>(o); deg <=> o.deg; end
end
puts Temp.new(20) > Temp.new(15)

Preguntas frecuentes

¿La lección «Comparable y Enumerable» es gratis?

Sí — el texto completo de «Comparable y Enumerable» 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 «Comparable y Enumerable»?

Mixins estándar 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 3 de 4.

¿Cuánto tiempo toma la lección «Comparable y Enumerable»?

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. Definición de módulos
  2. include y extend
  3. Comparable y Enumerable
  4. prepend y resolución de métodos
← Volver a Ruby Academy