Logo

27 July 2020

Enumeradores em Ruby - parte 2

by marcelo castellani

‎¡Hola!

Tudo tranquilo? Espero que sim! Vamos falar de enumeradores em Ruby mais uma vez, que tal? E pra dar ritmo a nosso papo vamos de Limp Bizkit!.

Enumerators, again!

Neste artigo vamos dar sequencia a este artigo aqui onde falamos sobre como funcionam os métodos each, map, collect e select. Neste post, dado sequencia ao anterior, vamos criar uma classe marota e adicionar estes métodos a ela. Essa nossa classe será uma lista agenda de nome e telefone.

Antes, porém, vamos criar uma classe que tratará os dados dos contatos na agenda. No caso vamos ter apenas o nome e o telefone dessas pessoas.

class Person
  attr_accessor :name, :phone

  def initialize(name, phone)
    self.name = name
    self.phone = phone
  end
end

Até ai nenhuma surpresa. Vamos agora criar nossa Agenda. Ela será um tanto quanto limitada, recebendo em seu initialize duas pessoas, não podendo ter outros telefones. Poderíamos utilizar um array aqui, mas o array já tem o Enumerable implementado, então aí estaríamos aprendendo necas de pitibiribas como dizia meu saudoso avô Aldo.

class Agenda
  include Enumerable

  attr_accessor :person1, :person2

  def initialize(person1, person2)
    self.person1 = person1
    self.person2 = person2
  end

  def each
    yield person1
    yield person2
  end
  end

Perceba que implementamos um método each maroto alí, além de incluirmos o módulo Enumerable. Essas são as duas coisas necessárias para ganharmos um monte de métodos bonitos em nossa classe. Vamos iniciar uma nova agenda agora:

> agenda = Agenda.new(
>   Person.new("Nicolas", "11923456789"),
>   Person.new("Marcelo", "11912345678"))

Parece pouca coisa mas fizemos muito aqui. Temos a condição de usar o método map (ou collect), por exemplo:

> puts agenda.map { |person| person.name }
Marcelo
Nicolas

Ou o método select:

> puts agenda.select { |person| person.name == "Marcelo" }
#<Person:0x000056503ede9ce0>

Louco não? E como sempre, em Ruby resolvemos tudo com poucas linhas de código da melhor forma. No próximo artigo vou falar sobre como usar o modulo Comparable.

tags: Ruby