o bloco ensure pode ocorrer mesmo sem blocos rescue.
def calculate_installment_price(total_value, installments)
begin
65
2.6. Classes e módulos
Casa do Código
puts "O resultado é #{total_value / installments}"
rescue
puts "Não foi possível calcular o valor da parcela"
ensure
puts "Pronto."
end
end
calculate_installment_price(100, 5) # O resultado é 20
# Pronto.
calculate_installment_price(100, 0) # Não foi possível calcular
# o valor da parcela
# Pronto.
O begin é bastante útil caso queiramos especificar um trecho de código que pode
sinalizar exceções. Porém, no caso de métodos inteiros, podemos omiti-lo:
def calculate_installment_price(total_value, installments)
puts "O resultado é #{total_value / installments}"
rescue
puts "Não foi possível calcular o valor da parcela"
ensure
puts "Pronto."
end
Esta definição é um pouco mais enxuta, sem perder clareza, então é recomen-
dado o uso quando possível.
Mais informações sobre exceptions
Tratamento de exceções, por mais simples que pareça, é um assunto deli-
cado, e é necessário bastante cuidado para que o código não se torne um
grande macarrão incompreensível.
Se você quiser saber mais sobre o assunto, recomendo a leitura do exce-
lente livro Exceptional Ruby [6].
66
Casa do Código
Capítulo 2. Conhecendo Ruby
2.7
Bibliotecas e RubyGems
Uma linguagem de programação não pode ser completa sem possuir um mecanismo
de compartilhamento de código, de modo que possamos quebrar um sistema grande
em diversos arquivos.
Bibliotecas
Em Ruby, existem três maneiras para se carregar um código externo:
load: Carrega o arquivo referenciado;
require: Carrega o arquivo referenciado, porém, se ele já foi carregado em
algum outro ponto do código, nada será feito;
require_relative: Funciona da mesma maneira que o require, porém so-
mente funciona com caminhos relativos ao sistema de
arquivos. Veremos mais
detalhes logo adiante.
O require é definitivamente a maneira mais usada para carregar arquivos Ruby
pelo fato do arquivo ser carregado apenas uma vez. Quando um arquivo é carregado
via require, ele é adicionado a uma lista chamada $LOADED_FEATURES. Ou seja, isso
significa que se o arquivo Ruby for editado externamente, ele não será recarregado,
havendo a necessidade de reiniciar o processo.
Uma particularidade sobre o require é que, se o caminho passado for relativo,
ele será procurado apenas no $LOAD_PATH e um erro será apresentado caso não seja
encontrado. Para carregar arquivos que não estão no $LOAD_PATH, é necessário men-
cionar o caminho relativo. Vejamos a seguir exemplos:
Usando o load:
load 'purchase.rb' #=> true
Purchase.new
# #<Purchase:0x007f9062b49b60>
Agora o require:
require './purchase' # Podemos omitir o .rb com o require!
Purchase.new
# #<Purchase:0x007f9062b49b60>
Note que se removermos o caminho do arquivo, o require necessita que a pasta
em que o arquivo se encontra esteja no $LOAD_PATH:
67
2.7. Bibliotecas e RubyGems
Casa do Código
require 'purchase' # LoadError: cannot load such file -- purchase
$LOAD_PATH << "./" # $LOAD_PATH é um Array com todos os caminhos
# a serem procurados
require 'purchase' # Agora funciona, o purchase.rb é encontrado
Purchase.new
# #<Purchase:0x007f9062b49b60>
require_relative 'purchase'
Purchase.new
# #<Purchase:0x007f9062b49b60>
Cuidado com require_relative
O require_relative possui um pequeno problema quando executa-
mos o comando via IRB. Isso acontece porque, quando executamos o
require_relative, o Ruby tenta inferir a pasta raiz pelo arquivo em
execução. O problema é que, quando executamos via IRB, não existe
nenhum arquivo, então o Ruby irá sinalizar uma exceção mencionando
este fato.
RubyGems
A linguagem Ruby possui uma comunidade bastante ativa de programadores
que compartilham código. Para facilitar esse compartilhamento, a comunidade Ruby
inventou as chamadas RubyGems, ou gems. A criação de uma RubyGem ocorre da
seguinte forma:
1) Um desenvolvedor constrói uma biblioteca e deseja compartilhá-la;
2) O desenvolvedor prepara um arquivo chamado gemspec que informa coisas como
nome do autor original, colaboradores, versão daquela biblioteca, site, documen-
tação, e várias outras informações;
3) Em seguida, ele prepara o pacote usando a ferramenta gem, que gera um arquivo
terminado em .gem.
4) Depois de criar uma conta no site do RubyGems (http://rubygems.org), gratuita-
mente, o desenvolvedor usa o comando gem para publicá-la.
68
Casa do Código
Capítulo 2. Conhecendo Ruby
Instalando Rubygems
Uma vez publicada, qualquer desenvolvedor pode instalar e usar essa gem. Va-
mos instalar a gem nokogiri, para processamento de XMLs. Para isso, primeira-
mente temos que instalá-la, usando a linha de comando:
$ gem install nokogiri
Fetching: nokogiri-1.5.3.gem (100%)
Building native extensions. This could take a while...
Successfully installed nokogiri-1.5.3
1 gem installed
Installing ri documentation for nokogiri-1.5.3...
Installing RDoc documentation for nokogiri-1.5.3...