0Pricing
Ruby Academy · Aula

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.inspect

Comparable 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).inspect

Enumerá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).inspect

Agregaçã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.count

select 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.first

Reunindo tudo

As misturas padrão recompensam um contrato mínimo:

  • Comparable: defina <=> e obtenha todas as comparações.
  • Enumerable: defina each e 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.inspect

Verificação rápida

Teste sua compreensão das misturas padrão.

Recapitulação

O senhor aprendeu sobre as misturas padrão:

  • Comparable precisa de <=> e oferece comparação, clamp e between?.
  • Enumerable precisa de each e 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

  1. Definindo módulos
  2. include e extend
  3. Comparable e Enumerable
  4. prepend e resolução de métodos
← Voltar para Ruby Academy