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.inspectComparable 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).inspectEnumerable 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).inspectAgregació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.countselect 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.firstCómo encaja todo
Los mixins estándar recompensan un contrato mínimo:
Comparable: defina<=>y obtenga todas las comparaciones.Enumerable: definaeachy 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.inspectComprobación rápida
Compruebe cuánto entiende de los mixins estándar.
Resumen
Ha aprendido sobre los mixins estándar:
Comparablenecesita<=>y proporciona comparación,clampybetween?.Enumerablenecesitaeachy 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
- Definición de módulos
- include y extend
- Comparable y Enumerable
- prepend y resolución de métodos