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

Шрифт
Фон

@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

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

0
Шрифт
Фон

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