@autor = autor
@isbn = isbn
@numero_de_paginas = numero_de_paginas
@preco = preco
end
def to_s
"Autor: #{@autor}, Isbn: #{@isbn}, Páginas: #{@numero_de_paginas}"
end
end
E podemos instanciar novos livros informando o preço:
teste_e_design = Livro.new "Mauricio Aniche", "123454", 247, 60.9
Agora para todos os objetos do tipo Livro que foram criados, desejamos tam-
bém saber seu preço. Mas lembre-se que as variáveis de instância são sempre pri-
vadas, ou seja, só conseguimos acessá-las dentro da classe Livro. A solução neste caso é criar um método público que retorne o valor da variável @preco:
# coding: utf-8
class Livro
# outros métodos
def preco
@preco
end
end
Agora, dada qualquer instância de um Livro, podemos invocar o método
preco que retornará o valor da variável @preco:
teste_e_design = Livro.new "Mauricio Aniche", "123454", 247, 60.9
puts teste_e_design.preco # => 60.9
Repare que fizemos um método com o mesmo nome da variável. Essa é uma
convenção utilizada pelos desenvolvedores Ruby, onde o método que acessa a variá-
vel e a própria variável possuem o mesmo nome.
39
Casa do Código
O Brasil é um país que possui inflação que gira em torno de 6% a 7% ao ano.
Em nossa aplicação, permitiremos que os nossos livros sofram alterações de preços
também. Dessa forma, dada uma instância do tipo Livro desejamos alterar seu
preço:
teste_e_design = Livro.new "Mauricio Aniche", "123454", 247, 60.9
teste_e_design.preco = 79.9
# => NoMethodError: undefined method `preco=' for
Autor: Mauricio Aniche, Isbn: 123454, Páginas: 247:Livro
Lembre-se novamente, as variáveis de instância são sempre privadas. Então por
enquanto não conseguimos alterar o preço de um objeto Livro. A solução é criar-
mos um método público que recebe o novo preço do livro como argumento e atribua
este preço a variável que guarda o valor do nosso livro, @preco:
# coding: utf-8
class Livro
# outros métodos
def preco
@preco
end
def preco=(preco)
@preco = preco
end
end
Podemos ver outra convenção para criar código Ruby mais legível. Os métodos
que alteram o valor de variáveis de instância costumam ter o nome da variável sem
o @, com um sinal de = e a declaração dos argumentos do método. Mas lembre-se
que isso é uma convenção.
Para alterar o preço de uma instância do tipo Livro podemos agora invocar o
método preco=:
teste_e_design = Livro.new "Mauricio Aniche", "123454", 247, 60.9
teste_e_design.preco=(79.9)
puts teste_e_design.preco
40
Casa do Código
Capítulo 3. O começo da nossa aplicação
Ao executarmos o código acima, veremos que o novo preço do livro é 79.9.
Mas podemos deixar nosso código mais simples. Remover os parênteses é um bom
caminho para melhorar a legibilidade:
teste_e_design.preco=79.9
Quando definimos métodos que possuem sinal de = em sua nomenclatura, po-
demos adicionar um espaço na chamada do método:
teste_e_design.preco = 79.9
Diferença sutil, mas que deixa a sensação de que estamos alterando o valor da
variável diretamente. Nosso código está legível, mas podemos melhorá-lo utili-
zando
a própria linguagem Ruby. Como criar métodos que acessam e modificam
os valores de uma variável de instância é uma tarefa bastante comum, os criado-
res da linguagem pensaram em facilitar este processo e criaram: attr_writer e
attr_reader.
Esses métodos podem receber vários argumentos do tipo Symbol. Cada sím-
bolo representa o nome da variável que desejamos expor para leitura ou escrita:
# coding: utf-8
class Livro
attr_writer :preco
attr_reader :preco
# outros métodos
end
Quando chamamos o método attr_writer passando o símbolo :preco,
automaticamente os objetos do tipo Livro passam a ter um método preco=. O
mesmo acontece quando chamamos o método attr_reader, neste caso os objetos
passam a ter um método preco:
teste_e_design = Livro.new "Mauricio Aniche", "123454", 247, 60.9
teste_e_design.preco = 79.9
puts teste_e_design.preco
Se você deseja criar um par de métodos, um de leitura e outro de escrita para
uma determinada variável de instância, existe uma maneira mais simples do que
utilizar os métodos attr_reader e attr_writer. Com esse intuito, o método
attr_accessor foi criado:
41
Casa do Código
# coding: utf-8
class Livro
attr_accessor :preco
# outros métodos
end
O attr_accessor atua como um substituto para os métodos attr_writer
e attr_reader. Quando o usamos, definimos um método de leitura e um outro
de escrita seguindo a convenção da linguagem.
Com isso os métodos preco e preco= que haviam sido definidos manual-
mente, podem ser removidos.
Símbolos
Símbolos são palavras que parecem com variáveis, eles podem conter letras, nú-
meros e _. Símbolos são String mais leves e geralmente utilizados como identifi-
cadores.
A verdade é que símbolos são strings, como uma diferença importante, eles são
imutáveis, ou seja, seu valor interno não pode ser alterado. Por isso geralmente os
utilizamos como identificadores.
:um_simbolo_qualquer.object_id == :um_simbolo_qualquer.object_id