variáveis de instância:
class Livro
def initialize(autor, isbn = "1", numero_de_paginas)
@autor = autor
@isbn = isbn
@numero_de_paginas = numero_de_paginas
end
end
Repare que as variáveis de instância tem um caractere @ antes do nome. O im-
portante aqui é percebermos
que as variáveis podem ter nomes iguais, porém, variá-
veis com @ são de instância e compõem o estado interno do objeto que está sendo
criado, enquanto variáveis locais possuem um escopo mais curto, elas duram apenas
até o término da execução do método.
Visibilidade das variáveis de instância
Em Ruby, todas as variáveis de instância criadas são privadas, ou seja,
não possuem acesso externo, nem para leitura, nem para escrita. Se qui-
sermos acessá-las, vamos utilizar recursos da própria linguagem, que ve-
remos nas próximas seções.
Vamos testar o método initialize que agora guarda os parâmetros em va-
riáveis de instância:
teste_e_design = Livro.new("Mauricio Aniche", "123454", 247)
web_design_responsivo = Livro.new("Tárcio Zemel", "452565", 321)
p teste_e_design
p web_design_responsivo
O código acima produz a seguinte saída:
#<Livro:0x007fa526012048 @autor="Mauricio Aniche", @isbn="123454",
@numero_de_paginas=247>
#<Livro:0x007fa526012049 @autor="Tárcio Zemel", @isbn="452565",
@numero_de_paginas=321>
36
Casa do Código
Capítulo 3. O começo da nossa aplicação
puts ou p?
Quando precisamos imprimir informações no console em Ruby, po-
demos utilizar os métodos puts ou p. A primeira delas já havíamos
visto, o método puts. No exemplo de código onde testamos nossas va-
riáveis de instância, usamos o método p.
O método puts imprime o retorno do método to_s do objeto que
foi passado para ser impresso. Isto é, caso você faça puts variavel,
é como se ele mostrasse o valor de variavel.to_s, método que vere-
mos logo em seguida. Já o método p é mais utilizado quando queremos
realizar o debug do conteúdo do objeto passado como argumento. Nesse
caso, o método inspect do objeto é invocado e o retorno é impresso
na tela. Quando o conteúdo das variáveis de instância são impressas, é
porque o método inspect da classe Livro retorna os valores de todas
as variáveis do objeto criado.
3.4
Sobrescrevendo o método TO_S
Convenhamos que o resultado impresso não é o ideal, podemos retornar uma men-
sagem mais agradável caso algum usuário do nosso código instancie e queira ver
informações mais coerentes sobre uma instância de Livro.
Aliás, exibir uma mensagem amigável ao imprimir um objeto é considerado
uma boa prática. Esse assunto é inclusive capítulo de um livro muito conhecido na
comunidade Java, chamado Effective Java, escrito por Joshua Bloch, hoje engenheiro do Google.
Em Ruby podemos aplicar a mesma prática sobrescrevendo o método to_s,
que é herdado naturalmente por todas as classes, pois faz parte da classe Object, e
fazendo com que ele devolva uma String:
# coding: utf-8
class Livro
def initialize(autor, isbn = "1", numero_de_paginas)
@autor = autor
@isbn = isbn
@numero_de_paginas = numero_de_paginas
end
37
Casa do Código
def to_s
"Autor: #{@autor}, Isbn: #{@isbn}, Páginas: #{@numero_de_paginas}"
end
end
Uma novidade nesse código é que em Ruby, quando desejamos retornar um de-
terminado valor não precisamos explicitamente colocar a palavra return antes do
valor que desejamos retornar, o retorno de qualquer método escrito em Ruby sempre
será a última instrução de código (veremos este comportamento com mais detalhes
no capítulo Ruby Funcional). Se a última instrução de um método for, por exem-
plo, a String "Um texto qualquer", ao invocarmos este método receberemos
como retorno do método a própria String Um texto qualquer. Porém, em
algumas ocasiões o uso da palavra return é necessário, dependendo da lógica que
estamos implementando, mas lembre-se que ele nunca é obrigatório.
Lembre-se que o método to_s é invocado quando utilizamos o método puts.
Portanto vamos alterar o código que testa a criação dos objetos com suas variáveis
de instância:
teste_e_design = Livro.new("Mauricio Aniche", "123454", 247)
web_design_responsivo = Livro.new("Tárcio Zemel", "452565", 321)
puts teste_e_design
puts web_design_responsivo
Agora o código
acima produz a seguinte saída:
Autor: Mauricio Aniche, Isbn: 123454, Páginas: 247
Autor: Tárcio Zemel, Isbn : 452565, Páginas: 321
A mensagem está muito mais elegante e concisa. Lembre-se, sobrescrever o mé-
todo to_s sempre é uma boa prática quando queremos criar uma mensagem mais
elegante que descreva o estado interno dos objetos.
3.5
Alteração e leitura de atributos
3.5. ALTERAÇÃO E LEITURA DE ATRIBUTOS
Para que nossos livros possam ser vendidos, precisamos que eles tenham um atributo
que contém seu preço. Para isso vamos adicionar um novo argumento no método
initialize da classe Livro e guardar seu valor em uma variável de instância
chamada @preco:
38
Casa do Código
Capítulo 3. O começo da nossa aplicação
# coding: utf-8
class Livro
def initialize(autor, isbn = "1", numero_de_paginas, preco)