Comparable e Enumerable
Mixins padrão.
Comparable e Enumerable é uma aula grátis de Ruby Academy no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Ruby Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Ruby Academy inclui 4 aulas no total.
Misturas padrão
O Ruby fornece módulos poderosos que você pode misturar às suas próprias classes. Dois destaques são Comparable e Enumerable. Cada um oferece muitos métodos em troca da implementação de apenas um.
puts Comparable.instance_methods.sort.inspectComparable precisa de <=>
Comparable exige que você defina o operador nave espacial <=>, que retorna -1, 0 ou 1. Em troca, você obtém <, <=, ==, >, >= e 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 comparação gratuitos
Com um único operador definido, todos os métodos de comparação funcionam automaticamente.
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 Comparável
Comparable também oferece clamp, que mantém um valor dentro de um intervalo.
puts 15.clamp(0, 10)
puts (-5).clamp(0, 10)
puts 7.clamp(0, 10)Ordenação de objetos comparáveis
Como <=> está definido, um vetor dos seus objetos pode ser ordenado automaticamente.
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).inspectEnumerável precisa de each
Enumerable exige que o senhor defina each. Em troca, o senhor obtém map, select, reduce, min, max, sort e dezenas de outros.
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).inspectAgregação gratuita
Com each definido, métodos de agregação como count, min e include? ficam disponíveis.
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 e reject
Os métodos de filtragem também ficam disponíveis.
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 totais
reduce (com o apelido inject) combina elementos, por exemplo, somando-os.
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 as duas misturas
Adicione Comparable para ordenar e Enumerable para iterar, e sua classe passará a se comportar como uma coleção 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.firstReunindo tudo
As misturas padrão recompensam um contrato mínimo:
Comparable: defina<=>e obtenha todas as comparações.Enumerable: definaeache obtenha todo o conjunto de ferramentas para coleções.
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.inspectVerificação rápida
Teste sua compreensão das misturas padrão.
Recapitulação
O senhor aprendeu sobre as misturas padrão:
Comparableprecisa de<=>e oferece comparação,clampebetween?.Enumerableprecisa deeache oferece map, select, reduce, mínimo, máximo e muito mais.- Juntas, elas fazem as classes personalizadas parecerem integradas à linguagem.
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)Perguntas Frequentes
A aula “Comparable e Enumerable” é grátis?
Sim — o texto completo de “Comparable e Enumerable” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Ruby Academy, atualize para CoddyKit PRO. O curso de Ruby Academy inclui 4 aulas no total.
O que vou aprender em “Comparable e Enumerable”?
Mixins padrão. Você pratica Ruby Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Ruby Academy?
Nenhuma experiência prévia é necessária. Ruby Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.
Quanto tempo leva a aula “Comparable e Enumerable”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Ruby Academy?
Sim. Cada aula de Ruby Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Definindo módulos
- include e extend
- Comparable e Enumerable
- prepend e resolução de métodos