atual que definimos no IRB:
class Livro
def initialize(autor, isbn = "1", numero_de_paginas)
puts "Autor: #{autor}, ISBN: #{isbn}, Pág: #{numero_de_paginas}"
end
end
Agora que a classe Livro foi colocada em um arquivo separado precisamos al-
terar a maneira que os testes desta classe serão feitos. Quando um IRB é aberto o
arquivo lib/livro.rb não é carregado automaticamente, você pode validar ten-
tando criar um objeto Livro abrindo um novo terminal:
Livro.new "Lucas Souza", 200
# => NameError: uninitialized constant Livro
Para carregar o conteúdo do arquivo lib/livro.rb é necessário utilizar o
método require da classe Kernel. O método require recebe como parâmetro
uma String que pode ser o nome do arquivo .rb que você deseja carregar. Se o
33
3.2. Crie a estrutura do projeto
Casa do Código
parâmetro não for o caminho absoluto do arquivo .rb o mesmo será procurado em
diretórios que estão definidos na constante $LOAD_PATH.
O arquivo lib/livro.rb não está em nenhum dos diretório listados em
$LOAD_PATH, que em geral, contém os diretórios onde estão os arquivos .rb
das classes core do Ruby. Sendo assim temos dois caminhos para fazer com que o
Ruby consiga carregar o arquivo que contém a classe Livro. O primeiro é adicionar
na
constante $LOAD_PATH, que é um objeto Array, o diretório lib do projeto
loja_virtual:
$LOAD_PATH << "caminho relativo do projeto loja_virtual/lib"
Ao executar este código, o require pode ser feito apenas com o nome do ar-
quivo da pasta lib que desejamos carregar:
require 'livro'
A segunda opção, e melhor na minha opinião, é carregar o arquivo passando o
seu caminho absoluto. Porém, isso pode ser um pouco custoso já que você pode
simplesmente resolver alterar o nome da pasta de loja_virtual para loja.
O ideal é utilizar o método expand_path da classe File que retorna o cami-
nho absoluto de um nome de arquivo passado como parâmetro, levando em con-
sideração o diretório onde a chamada do método é executado. Supondo que o
arquivo livro.rb esteja dentro da pasta lib, que por sua vez está dentro do
diretório '/home/lucas/loja_virtual' ao executar a chamada ao método
expand_path dentro deste diretório passando a String lib/livro o retorno do
método será '/home/lucas/loja_virtual/lib/livro':
# executando a partir do diretório /home/lucas/loja_virtual
puts File.expand_path("lib/livro")
# => "/home/lucas/loja_virtual/lib/livro"
Exatamente o diretório onde se encontra o arquivo livro.rb.
Agora para testar a classe Livro como fizemos na seção anterior, basta abrir um
novo IRB no diretório loja_virtual e invocar o método require passando o
caminho absoluto do arquivo livro.rb:
# executando a partir do diretório /home/lucas/loja_virtual
require File.expand_path("lib/livro")
# objeto Livro criado com sucesso
Livro.new "Lucas Souza", 200
34
Casa do Código
Capítulo 3. O começo da nossa aplicação
A partir de agora, todos as novas classes serão colocadas dentro de arquivos .rb
na pasta lib. E os testes serão feitos no IRB, lembrando que deve ser sempre aberto
a partir do diretório loja_virtual. E claro, é necessário carregar, utilizando o
método require, todas as classes que serão utilizadas no teste.
Outra dica importante: quando for necessário criar classes novas, haverá uma
indicação dos procedimentos que deverão ser feitos para que a mesma possa ser
testada. Quando houver alteração em classes já existentes, basta editar o conteúdo
da classe dentro de seu respectivo arquivo .rb. E lembre-se o projeto pode final
com a implementação completa pode ser encontrado no github:
https://github.com/lucasas/projeto-ruby
Encoding arquivos .R B
Os arquivos que contém as classes criadas em nosso sistema, ficarão
em arquivos .rb dentro de um diretório de sua preferência. Porém é
importante ressaltar que arquivos .rb possuem um encoding US-ASCII
por padrão. Caso seu código contenha qualquer caractere que não for
compatível com o ASCII, a interpretador Ruby será finalizado e acusará
o erro: invalid multibyte char (US-ASCII).
Se você quiser alterar o encoding padrão do arquivo .rb, basta adi-
cionar a seguinte linha do arquivo:
# encoding: utf-8
Neste exemplo, ajustamos o encoding do arquivo para UTF-8, que
permitirá que você use acentos e outros caracteres.
3.3
Defina os atributos de instância
Os parâmetros passados para o método initialize são na verdade variáveis lo-
cais, ou seja, assim que terminar a execução do método, as variáveis locais simples-
mente desaparecem.
Vamos precisar as informações do autor, número de páginas e ISBN para traba-
lhar com elas mais adiante nos nossos programas. Queremos que a informação dos
livros acompanhem o objeto que vai ser instanciado. Para resolver este problema
precisamos copiar o valor destes parâmetros para variáveis de instância de cada ob-
jeto. Este comportamento é muito comum quando criamos métodos construtores.
35
3.3. Defina os atributos de instância
Casa do Código
Então vamos copiar os valores dos parâmetros do método initialize para