uma classe que podemos chamar de Biblioteca, e quando houver a necessidade
de mudarmos de Array para alguma outra estrutura, faremos em apenas um lu-
gar. Adicione a definição da classe Biblioteca dentro de um arquivo chamado
biblioteca.rb dentro do diretório lib:
class Biblioteca
def initialize
@livros = []
end
def adiciona(livro)
@livros << livro
end
end
Agora para guardar os livros que criamos, não vamos criar um Array e apendar
os valores diretamente nele. Criaremos um objeto do tipo Biblioteca e chama-
remos o método responsável por adicionar novos livros na biblioteca. Porém, para
testar a classe Biblioteca é necessário carregar o arquivo que contém sua defini-
ção:
require File.expand_path('lib/livro')
require File.expand_path('lib/biblioteca')
Ao passar do tempo, os arquivos necessários para efetuar os testes serão um
maior número. Para não dificultar os testes, vamos criar um único arquivo que fará o
require de todos os outros. Vamos chamá-lo de loja_virtual.rb e adicioná-
lo no diretório lib da pasta loja_virtual. Dentro dele faremos o carregamento
dos arquivos biblioteca.rb e livro.rb:
50
Casa do Código
Capítulo 4. Estruturas de dados
require File.expand_path('lib/livro')
require File.expand_path('lib/biblioteca')
Agora para efetuar os testes basta executar um único require, do arquivo
loja_virtual.rb:
require File.expand_path('lib/loja_virtual')
E executar os testes da classe Biblioteca:
biblioteca = Biblioteca.new
teste_e_design = Livro.new "Mauricio Aniche", "123454", 247, 70.5
web_design_responsivo = Livro.new "Tárcio Zemel", "452565", 189, 67.9
biblioteca.adiciona teste_e_design
biblioteca.adiciona web_design_responsivo
Se precisarmos acessar quais são os livros que existem dentro da nossa biblioteca,
basta expor a variável @livros através do attr_reader:
class Biblioteca
attr_reader :livros
def initialize
@livros = []
end
def adiciona(livro)
@livros << livro
end
end
E para acessar as variáveis, podemos chamar o método
livros na
Biblioteca:
biblioteca = Biblioteca.new
teste_e_design = Livro.new "Mauricio Aniche", "123454", 247, 70.5
web_design_responsivo = Livro.new "Tárcio Zemel", "452565", 189, 67.9
biblioteca.adiciona teste_e_design
51
4.3. Percorrendo meu array
Casa do Código
biblioteca.adiciona web_design_responsivo
p biblioteca.livros
# => [Autor: Mauricio Aniche, Isbn: 1, Páginas: 247,
Autor: Tárcio Zemel, Isbn: 1, Páginas: 189]
4.3
Percorrendo meu array
No capítulo 2, aprendemos algumas estruturas de controle, entre elas o for, que
serve para iterarmos sobre ranges, e também coleções como o Array. O método
livros do objeto biblioteca, retorna todos os livros em formato de Array. Para
acessar cada livro deste array, basta iterarmos através do for:
biblioteca = Biblioteca.new
# popula a biblioteca
for livro in biblioteca.livros do
p livro.valor
end
# => 70.5
# => 67.9
4.4
Como separar os livros por categoria: traba-
lhe com Hash
A medida que nossa biblioteca cresce, precisamos separar os livros dentro da bibli-
oteca por categorias. Dessa forma, o primeiro passo para fazermos essa separação é
adicionarmos um atributo chamado categoria à classe Livro:
# coding: utf-8
class Livro
attr_accessor :valor
attr_reader :categoria
def initialize(autor, isbn = "1", numero_de_paginas, valor,
categoria)
@autor = autor
@isbn = isbn
52
Casa do Código
Capítulo 4. Estruturas de dados
@numero_de_paginas = numero_de_paginas
@valor = valor
@categoria = categoria
end
def to_s
"Autor: #{@autor}, Isbn: #{@isbn},
Páginas: #{@numero_de_paginas}, Categoria: #{@categoria}"
end
end
A categoria do livro será um Symbol, como:
:ruby, :testes, :html,
:javascript,
:ios etc. Os livros que criamos anteriormente recebem um ar-
gumento a mais, contendo a sua respectiva categoria:
teste_e_design = Livro.new "Mauricio Aniche", "123454", 247, 60.9,
:testes
puts teste_e_design.categoria # => :testes
Agora que cada livro possui sua categoria, vamos adaptar nossa classe
Biblioteca para guardá-los. Dessa forma, a classe Biblioteca terá a organi-
zação de categorias.
Os arrays guardam os elementos sequencialmente e não existe nenhuma divisão
destes elementos. Precisamos de uma estrutura que suporte este tipo divisão, um
número N de objetos em um determinado container, sendo possível termos vários
containers também.
Vamos utilizar um Hash, estrutura que guarda sempre uma chave (identificador
único, que geralmente é um símbolo) e um valor (que pode ser qualquer tipo de
objeto Ruby). Sua inicialização é feita utilizando {}:
teste_e_design = Livro.new "Mauricio Aniche", "123454", 247, 60.9,
:testes
web_design_responsivo = Livro.new "Tárcio Zemel", "452565", 189, 70.9,
:web_design
hash = {"123454" => web_design_responsivo,
"452565" => web_design_responsivo}
O hash acima possui dois containers, um cujo identificador é a
String
"123454", que corresponde ao isbn do objeto teste_e_design, e outro
53
4.4. Como separar os livros por categoria: trabalhe com Hash