Souza Lucas - Ruby: Aprenda a programar na linguagem mais divertida стр 13.

Шрифт
Фон

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)

Ваша оценка очень важна

0
Шрифт
Фон

Помогите Вашим друзьям узнать о библиотеке