Classes 101: Família ATTR

Hey, como vai?!

Bem, agora que já sabemos como fazer os métodos “à mão”, por que não usamos as ferramentas que o Ruby nos traz?

O Ruby já quebra grande parte do galho para gente portando a família attr, onde:

  • attr_reader : Cria somente o método de leitura da variável (get);
  • attr_writer : Cria somente o método de escrita da variável (set);
  • attr_acessor : Cria ambos os métodos.

Lembrando muito a forma como declaramos tipos primitivos, em outras linguagens, cada integrante leva a frente de si o(s) simbolo(s) (: , symbol) da(s) variável(is) alvo dos métodos.


ATTR_READER

class Dog
  attr_reader :name, :height, :weight

  def initialize(name, height, weight)
    @name = name
    @height = height
    @weight = weight
  end
end

dog = Dog.new 'Paul', 15, 15

print "Name: #{dog.name}, Height: #{dog.height},"

puts " Weight: #{dog.weight}"
    #=> Name: Paul, Height: 15, Weight: 15

Acima, se tentarmos fazer algo como: dog.name = 'Lince', um erro é lançado, já que não há forma de atribuição de valor.


ATTR_WRITER

class Dog
  attr_writer :name, :height, :weight

  def to_s
    "Name: #{@name}, Height: #{@height}, Weight: #{@weight}"
  end
end

dog = Dog.new
dog.name = 'Paul'
dog.height = 15
dog.weight = 15

puts dog
    #=> Name: Paul, Height: 15, Weight: 15

Perceba que aqui reescrevemos o método to_s , que retorna a versão String do objeto sobre o qual é chamado. Como o método puts imprime uma String é pela tal que ele procura quando chamado sobre o objeto em questão, no nosso caso dog.

O que fizemos acima é muito interessante e deve ser usado.


ATTR_ACCESSOR

Por fim falaremos daquele que faz tudo por nós:

class Dog
  attr_accessor :name, :height, :weight

  def to_s
    "Name: #{@name}, Height: #{self.height}, Weight: #{weight}"
  end
end

dog = Dog.new

dog.name = 'Paul'
dog.height = 15
dog.weight = 15

puts dog

dog.name = 'Peter'

puts "Name: #{dog.name}, Height: #{dog.height},"
print " Weight: #{dog.weight}"

Saída:

Name: Paul, Height: 15, Weight: 15
Name: Peter, Height: 15, Weight: 15

Este código parece um pouco bagunçado, mas traz o foco do attr_accessor, getters e setters prontos para uso e, como seus irmãos, segundo as boas práticas do Ruby.

Bem, com isso finalizamos o post de hoje e também a série. Espero que tenham gostado ..


Até mais!!

classe101attr

Anúncios

Diga alguma coisa ... suas dúvidas quem sabe!

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s