Escolar Documentos
Profissional Documentos
Cultura Documentos
Why Guia de Ruby PDF
Why Guia de Ruby PDF
1. Sade mental.
Vitamina R. Vai direto para a cabea. Ruby vai lhe ensinar a expressar suas idias atravs de um computador.
Voc estar escrevendo estrias para uma mquina.
Habilidades criativas, gente. Deduo. Razo. Acenar com a cabea inteligentemente. A linguagem vai se
tornar uma ferramenta para melhorar a comunicao entre sua mente e o mundo. Eu notei que muitos usurios
experientes de Ruby parecem pensadores mais claros e objetivos. (Em contraste a: altamente preconceituosos e
grosseiros.)
2. Um homem em uma ilha.
Ruby nasceu no Japo. O que bizarro. O Japo no conhecido por seu software. E como linguagens de
programao so largamente escritas em ingls, quem iria imaginar uma linguagem vinda do Japo?
E ainda assim, aqui temos Ruby. Contra todas as adversidades, Yukihiro Matsumoto criou Ruby em 24 de
Fevereiro de 1993. Pelos ltimos dez anos, ele tem obstinadamente trazido Ruby para uma audincia global.
triunfante, nobre e tudo mais. Apie a diversidade. Ajude-nos a dobrar a Terra, s um pouquinho.
3. Grtis.
Usar Ruby no custa nada. O cdigo do prprio Ruby est aberto para todo o mundo inspirar/expirar. At esse
livro de graa. tudo parte de uma enorme doao que deveria ter alguma venda casada junto.
Voc poderia pensar que ns faramos voc comprar aspiradores de p ou tempo de uso, ou falsos Monet. Voc
poderia pensar que haveria uma palestra de 90 minutos onde o dono da empresa aparece no final e fora voc a
fechar negcio.
No. grtis.
Com isso, hora do livro comear. Voc pode pegar seu marca-texto e comear a arrast-lo sobre cada palavra
cativante a partir desta sentena. Eu acho que tenho spray de cabelo e dinheiro de brinquedo o suficiente comigo para
me sustentar at a pgina final.
3.
Disseram-me que este captulo combina bem com uma toalha. Algo para voc enxugar seu rosto quando o suor
comear a escorrer.
De fato, estaremos percorrendo toda a linguagem muito rpido. Ser como acender todos os fsforos de uma caixa do
jeito mais rpido possvel.
Minha conscincia no me deixa chamar o Ruby de uma linguagem de computador. Isso implica que a linguagem
funciona primariamente em termos de computador. Que a linguagem criada para acomodar o computador, nica e
exclusivamente. E portanto, ns, os programadores, somos estrangeiros, buscando cidadania no pas dos
computadores. a linguagem do computador e ns somos os tradutores para o mundo.
Mas como voc a chamaria quando seu crebro comea a pensar nessa linguagem? Quando voc comea a usar as
prprias palavras e coloquialismos da linguagem para se expressar. Diga, o computador no consegue fazer aquilo.
Como pode ento ser a linguagem do computador? Ela nossa, ns a falamos nativamente!
Ns no podemos mais verdadeiramente cham-la de linguagem de computador. Ela papo de programador. a
linguagem dos nossos pensamentos.
Leia o trecho a seguir em voz alta.
5.times { print "Odelay!" }
No ingls, as pontuaes (pontos, exclamaes, parnteses) so mudas. Pontuao agrega significado s palavras, d
pistas da inteno do autor na frase. Vamos ento ler o trecho assim: Cinco vezes imprima Odelay!.
Que exatamente o que este pequeno programa Ruby faz. A exclamao espanhol mutante do Beck ser impressa
cinco vezes na tela do computador.
Leia o trecho a seguir em voz alta.
exit unless "restaurante".include? "aura"
Aqui estamos realmente fazendo um teste bsico. Nosso programa vai exit (sair) (o programa vai terminar) unless (a
menos que) a palavra restaurante contenha (ou inclua) a palavra aura. Novamente, em Portugus: Saia a nao ser
que a palavra restaurante inclua a palavra aura.
J viu alguma linguagem de programao usar a pontuao to eficientemente? Ruby usa a pontuao, como
exclamaes e interrogaes, para melhorar a legibilidade do cdigo. Ns estamos fazendo uma pergunta no cdigo
acima, ento por qu no deixar isso aparente?
Leia o trecho a seguir em voz alta.
['torrada', 'queijo', 'vinho'].each { |comida| print comida.capitalize }
Enquanto este pedao de cdigo menos legvel e parecido com uma frase que o anterior, eu ainda assim o encorajo a
ler em voz alta. Enquanto o Ruby algumas vezes soa como Portugus noutras soa como um breve Portugus.
Totalmente traduzido para Portugus, voc poderia ler desta maneira: Com as palavras torrada, queijo, e vinho:
pegue cada comida e a imprima com a primeira letra maiscula.
O computador ento responde de forma corts: Torrada, Queijo e Vinho.
Neste ponto, voc deve estar se perguntando como essas palavras realmente funcionam juntas. O cara-plida deve
estar imaginando o que os pontos e chaves significam. Vou discutir as vrias partes da conversa em seguida.
Tudo que voc precisa saber at agora que o Ruby basicamente construdo de sentenas. Elas no so exatamente
sentenas em ingls. Elas so pequenas colees de palavras e pontuao que expressam um simples pensamento.
Estas sentenas podem formar livros. Elas podem formar pginas. Elas podem formar romances inteiros, quando
combinadas. Romances que podem ser lidos por humanos, mas tambm por computadores
12_000_000_000
Acima, abra o mtodo. Nesta ao, o verbo. Em alguns casos, voc ver aes ligadas juntas.
porta_da_frente.abra.feche
Acima temos uma ao tambm. Estamos instruindo o computador a testar a porta para ver se est aberta. O mtodo
poderia se chamar Porta.teste_para_ver_se_esta_aberta, mas o nome esta_aberta? sucinto e
tambm correto. Exclamaes e interrogaes podem ser usados em nomes de mtodos.
Argumentos de Mtodo
Um mtodo talvez precise de mais informao para realizar sua ao. Se quisermos que o computador pinte a porta,
devemos prover uma cor tambm.
Argumentos de mtodo vo ligados ao final do mtodo. Os argumentos esto geralmente cercados por parnteses e
separados por vrgulas.
porta_da_frente.pintar( 3, :vermelho )
O cdigo acima pinta a porta da frente com trs demos de vermelho, seca por trinta minutos e fecha a porta. Mesmo
que o ltimo mtodo no tenha argumentos, voc pode colocar parnteses se quiser. Um cano vazio no tem muito
uso, ento os parnteses so geralmente deixados de lado.
Alguns mtodos (como print) so mtodos do kernel. Estes mtodos so usados por todo Ruby. J que eles so to
comuns, voc no usa o ponto.
print "Veja, sem ponto."
Mtodos de Classe
Assim como os mtodos descritos acima (tambm chamados mtodos de instncia), mtodos de classe so geralmente
ligados depois de variveis e constantes. Ao invs de ponto, usa-se dois pontos duplo.
Porta::new( :carvalho )
Como foi visto acima, o mtodo de classe new mais usado para se criar coisas. No exemplo cima, estamos pedindo
ao Ruby para fazer uma porta de carvalho nova para ns. Claro, o Ruby no tem conhecimento de como fazer uma
portaassim como uma pilha de madeira, madeireiros, e aquelas longas, nervosas, serras acionadas por dois homens.
Variveis Globais
Variveis que comeam com um cifro so globais.
$x, $1, $pedacudo e $BAcOn_PeDAcUDo so exemplos.
A maioria das variveis so temporrias por natureza. Algumas partes do seu programa so como casas. Voc entra e
elas tm suas prprias variveis. Em um casa, voc pode ter um pai que representa Archie, um caixeiro-viajante
colecionador de esqueletos. Em outra casa, pai pode representar Peter, um domador de lees com grande apreo por
flanela. Cada casa tem um sentido prprio para pai.
Com variveis globais, voc garante que a varivel ser a mesma em cada casinha. O sinal de cifro bem apropriado.
Todo lar Americano respeita o valor do cifro. Somos doidos pela coisa. Tente bater em qualquer porta na Amrica e
d a eles dinheiro. Eu posso garantir que voc no ver a mesma reao se bater em uma porta e oferecer Peter, um
domador de lees com grande apreo por flanela.
Variveis globais podem ser usadas em qualquer lugar no seu programa. Elas nunca saem da vista.
Variveis de Instncia
Variveis que comeam com uma arroba so variveis de instncia.
@x, @y, e @somente_o_maior_pedaco_de_bacon_que_eu_ja_vi so exemplos.
Estas variveis so muito usadas para se definir atributos de alguma coisa. Por exemplo, voc pode prover o Ruby
com a largura da porta_da_frente criando a varivel @largura dentro daquela porta_da_frente.
Variveis de instncia so usadas para se definir caractersticas de um objeto em Ruby.
Pense no smbolo arroba (at) como significando atributo.
Variveis de Classe
Variveis que comeam com duas arrobas so variveis de classe.
@@@x@, @@@y@, e
@@@vou_pegar_seus_bacons_pedacudos_e_ensinar_uma_licao_a_voces_dois@ so exemplos.
Variveis de classe so usadas, tambm, para se definir atributos. Mas ao invs de definir um atributo a apenas um
objeto no Ruby, variveis de classe do um atributo a vrios objetos relacionados no Ruby. Se as variveis de instncia
estipulam atributos para s uma porta_da_frente, ento variveis de classe estipulam atributos para tudo que for
Porta.
Pense no prefixo da dupla arroba significando atribua a todos. Adicionalmente, voc pode pensar em um esquadro
de AT-ATs do Guerra nas Estrelas, que so comandados pelo Ruby. Voc muda uma varivel de classe e no apenas
uma muda, todas elas mudam.
Blocos
Qualquer cdigo cercado por chaves um bloco.
2.times { print "Sim, Tenho usado bacon pedaudo nos meus exemplos, mas
no farei de novo!" } um exemplo.
Com blocos, voc pode agrupar pedaos de instrues juntas, assim elas pode ser passadas pelo seu programa. As
chaves do a aparncia de garras de caranguejo que pegaram o cdigo e o esto segurando. Quando voc vir essas
duas garras, lembre-se de que o cdigo dentro foi prensado em uma s unidade.
como uma daquelas caixinhas da Hello Kitty que eles vendem no shopping que vm lotadas de pequenos lpis e
papel microscpico, espremidos numa bolsa transparente e brilhante que pode ser escondida na palma da mo para
operaes secretas. Exceto que, blocos no ofuscam sua viso.
As chaves podem ser substitudas pelas palavras do e end, o que bacana se seu bloco for maior que uma linha.
loop do
print "Bem melhor."
print "Ah. Mais espao!"
print "Minhas costas estavam me matando dentro daquelas garras de caranguejo."
end
<stdout>Bem melhor.Ah. Mais espao!Minhas costas estavam me matando dentro daquelas
garras de caranguejo.</stdout>
Argumentos de Bloco
Argumentos de bloco so uma srie de variveis cercadas por smbolos tal que e separadas por vrgulas.
|en||x|, |x,y|, e |cima, baixo, todo_lado| so exemplos.
No cdigo acima, |x,y| so os argumentos. Depois dos argumentos, temos um pedao de cdigo. A expresso x +
y soma os argumentos.
Eu gosto de pensar nos smbolos tal que representando um tnel. Ele do a aparncia de uma calha na qual as
variveis esto descendo. (O x desce com as pernas abertas, enquanto o y harmoniosamente cruza as pernas.) Essa
calha age como uma passagem entre os blocos e o mundo l fora.
Variveis so passadas por essa calha (ou tnel) para dentro do bloco.
Ranges (Intervalos)
Um range formado por dois valores cercados por parnteses e separados por reticncias (na forma de dois ou trs
pontos).
(1..3) um range, representando os nmeros de um at trs.
Pense neles como um acordeo que fora fechado para se carregar. (Voc pode construir muito amor prprio levando
consigo um acordeo aberto mas, s vezes uma pessoa tem que mergulhar em dvidas e esconder cuidadosamente a
sanfona) Os parnteses so os lados deste pequeno acordeo de mo. Os pontos so a fole, mantendo as partes bem
unidas.
Normalmente, apenas dois pontos so usados. Se um terceiro ponto for usado, o ltimo valor no range ser excludo.
(0...5) representa os nmeros de zero at quatro.
Quando voc v o terceiro ponto, imagine abrir o acordeo um pouco menos. O necessrio para uma nota apenas de
seu fole. A nota este ltimo valor. Ns vamos deixar que o cu a coma.
Pense nele como uma centopia que foi grampeada no nosso cdigo. Os dois colchetes so grampos que no deixam a
centopia se movimentar, ento voc consegue distinguir onde cabea e onde a cauda. As vrgulas so as pernas da
centopia, balanando entre cada seo do seu corpo.
Era uma vez uma centopia que tinha vrgulas ao invs de pernas. O que significa que ela tinha que dar uma pausa
literria a cada passo. As outra centopias a respeitavam muito por isso e ela veio a ter uma bela presena no comando.
Oh, e que filantropo! Ela ficou famosa por dar folhas frescas aos menos afortunados.
Sim, um array uma coleo de coisas, mas ele tambm mantm estas coisas em uma ordem especfica.
Hashes
Um hash um dicionrio cercado por chaves. Dicionrios servem para encontrar definies das palavras. O Ruby faz
isso com setas feitas de sinais de igual, seguida por um sinal de maior que.
{'a' => 'porco-da-terra', 'b' => 'texugo'} um exemplo.
Desta vez, as chaves representam livrinhos. Veja como eles se parecem com pequenos livros abertos com dobras no
meio. Eles representam abrir e fechar nosso dicionrio.
Imagine que nosso dicionrio tem um definio em cada pgina. As vrgulas representam os cantos de cada pgina,
que ns viramos para ver a prxima definio. E em cada pgina: uma palavra seguida por uma seta apontando a
definio.
{
'nome' => 'Peter',
'profissao' => 'domador de lees',
'grande apreco' => 'flanela'
}
No estou comparando hashes a dicionrios por que voc pode guardar s definies na hash. No exemplo acima, eu
guardei informao pessoal de Peter, o domador de lees com grande apreo por flanela. Hashes so como dicionrios
porque elas so muito fceis de se procurar algo.
Diferentemente dos arrays, os itens na hash no so mantidos em ordem especfica.
Expresses Regulares
Uma expresso regular (ou regexp) uma srie de caracteres cercados por barras.
/ruby/, /[0-9]+/ e /^\d{3}-\d{3}-\d{4}/ so exemplos.
Expresses regulares so usadas para se achar palavras ou padres no texto. As barras dos lados da expresso so
alfinetes.
Imagine se voc tivesse uma palavrinha com alfinetes de cada lado e voc a segurasse por cima de um livro. Voc
passa a palavra pelo livro e quando ela chega perto de uma palavra que coincida, ela comea a piscar. Voc espeta a
expresso regular no livro, bem em cima da palavra que bate e ela brilha com as letras da palavra encontrada.
Oh, e quando voc espeta os alfinetes no livro, o papel espirra, reg-exp!
Expresses regulares so muito mais rpidas que folhear um livro. O Ruby pode usar uma expresso regular para
procurar volumes de livros muito rapidamente.
Operadores
Voc usar a seguinte lista de operadores para matemtica ou para comparar coisas no Ruby. Analise a lista, reconhea
alguns. Voc conhece, adio + e subtrao - e por a vai.
** ! ~ * / % + - &
<< >> | ^ > >= < <= <=>
|| != =~ !~ && += -= == ===
.. ... not and or
Keywords (Palavras-chave, Palavras-reservadas)
O Ruby tem um nmero de palavras embutidas, imbudas em significado. Estas palavras no podem ser usadas como
variveis ou modificadas s suas necessidades. Algumas delas ns j discutimos. Elas esto na caixa forte, meu amigo.
s relar nelas e voc ter um erro oficial de sintaxe.
alias and BEGIN begin break case class def defined
do else elsif END end ensure false for if
in module next nil not or redo rescue retry
return self super then true undef unless until when
while yield
Muito bom. Estes so os ilustres membros da linguagem Ruby. Teremos um belo banquete nos prximos trs
captulos, grudando essas partes em manhosos pedaos de (comovente) cdigo.
E recomendo que voc d mais um olhadela pelas partes da conversa. D uma ampla olhada nelas. Eu estarei testando
seu metal na prxima seo.
Diga em voz alta cada uma das partes da conversa usadas abaixo.
require 'net/http'
Net::HTTP.start( 'www.ruby-lang.org', 80 ) do |http|
print( http.get( '/en/LICENSE.txt' ).body )
end
A primeira linha chama um mtodo. O mtodo chamado require usado. Uma string passada ao mtodo
contendo 'net/http'. Pense nesta primeira linha de cdigo como uma sentena. Ns dissemos ao Ruby para
carregar um cdigo auxiliar, a biblioteca Net::HTTP.
As prximas trs linhas vo todas juntas. A constante Net::HTTP refere biblioteca que carregamos acima. Ns
estamos usando o mtodo start da biblioteca. Dentro do mtodo, estamos enviando uma string 'www.ruby-
lang.org' e o nmero 80.
A palavra do abre um block (bloco). O bloco tem uma varivel de bloco http. Dentro do bloco, o mtodo print
chamado. O que est sendo impresso?
A partir da varivel http, o mtodo get chamado. Dentro do get, ns passamos uma string contendo o caminho
'/en/LICENSE.txt'. Agora, repare que outro mtodo est ligado ao get. O mtodo body (corpo). Ento, o
bloco se fecha com end.
Est indo bem? S por curiosidade, voc consegue adivinhar o que este exemplo faz? Espero eu, que voc j esteja
vendo alguns padres no Ruby. Se no, balance sua cabea vigorosamente enquanto voc pe estes exemplos na sua
mente. O cdigo deve se quebrar em pedaos gerenciveis.
Por exemplo, este padro usando um monte de vezes:
variavel . metodo ( argumentos do metodo )
Estamos usando o Ruby para pegar uma pgina da web. Voc provavelmente j usou HTTP com o seu navegador.
HTTP o Hypertext Transfer Protocol. HTTP usado para se transferir pginas pela internet. Conceitualize um
motorista de nibus que pode dirigir por toda a internet e trazer de volta pginas para gente. No quepe dele esto
estampadas as letras HTTP.
A varivel http aquele motorista. O mtodo uma mensagem para o motorista. V get (pegar) a pgina da
web chamada /en/LICENSE.txt.
Ento quando voc v esta cadeia de mtodos:
http.get( '/en/LICENSE.txt' ).body
J que estaremos recebendo a pgina de volta pelo motorista http, voc pode ler isto na sua cabea assim:
pgina web .body
Este cdigo pega a pgina. Ns mandamos uma mensagem: body para a pgina, que por sua vez nos d HTML em
uma string. Ns ento imprimimos esta string. Veja como o bsico padro ponto-mtodo acontece em cadeia. No
prximo captulo vamos explorar todos estes tipos de padres no Ruby. Vai ser boa diverso.
Ento, o que este cdigo faz? Ele imprime o HTML da pgina web do Ruby na tela. Usando um motorista de nibus
habilitado para web.
Ento agora ns temos um problema. Eu comeo a achar que voc est gostando muito disso. E voc ainda nem
chegou no captulo em que eu uso msicas de pular-corda para lhe ajudar a aprender como trabalhar com XML!
Se voc j est gostando disso, ento as coisas esto indo realmente mal. Daqui a dois captulos voc j estar
escrevendo seus prprios programas Ruby. Na verdade, mais ou menos por ali que lhe farei comear a escrever seu
prprio jogo de RPG, sua prpria rede de compartilhamento de arquivos ( la BitTorrent), assim como um programa
que vai baixar nmeros genuinamente
aleatrios da Internet.
Eu nunca vi o presunto fazer coisa alguma, a no ser mijar. Hoje, nosso negcio nas Cavernas Ambrose com o
gnomo. Ele uma parte crucial das prximas lies. Vamos todos fazer com que ele se sinta bem-vindo. Comece a
esquentar os neurnios! (E por favor, troque essa ridcula cala de caubi.)
Ateno: esta lio mais vagarosa. Acompanhe-a. Isto ser uma longa e profunda respirao. A fase mais crucial de
sua instruo. Pode parecer que voc no est aprendendo muito cdigo a princpio. Voc estar aprendendo conceitos.
Ao final deste captulo, voc saber a beleza do Ruby. O conforto do cdigo ir se tornar um saco de dormir para o seu
prprio alvio.
Tirinha: Bem, ns uma vez usamos cristais azuis (como dinheiro). Mas realmente muito escuro aqui nas cavernas
para ver se algo azul. Sim, mas voc pode guardar dinheiro na sua sunga de natao sem se preocupar. de qualquer
modo, todos os insetos e besouros usam folhas como dinheiro. e eles no carregam cristais azuis porque eles so muito
pesados, ento ns trocamos.
Realmente, no o caminho que eu me lembro. Esse Gnomo estava me bipando constantemente. Quando me recusei a
cham-lo de volta, ele deixou uma mensagem no meu pager. Significado: ele bipou duas vezes e ento exibiu uma
pequena mensagem. A mensagem disse alguma coisa sobre, Desa aqui, rpido! e tambm, Ns temos que livrar a
terra destas pestes de lagartas empreendedoras, estes insetos insanos Vikings esto sufocando meus cristais azuis!
Ultimamente, a taxa de cmbio j se estabelece entre as folhas e cristais. Uma nota de rvore velha vale cinco cristais.
Ento a situao monetria bsica semelhante a isto:
cristal_azul = 1
folha_macia = 5
Este exemplo to ltimo captulo. Ainda assim. Ele um incio. Ns estamos definindo duas variveis. O sinal de
igual usado para atribuio.
Agora folha_macia representa o nmero 5 (tal como em: cinco cristais azuis.) Este conceito, at aqui, metade
de Ruby. Ns estamos definindo. Ns estamos criando. Isso a metade do trabalho. Atribuio a forma mais bsica
de definio.
Voc no pode se queixar, pode Gnomo? Voc construiu um imprio investindo seus cristais azuis no novo mercado
livre entre as criaturas da floresta. (E apesar de ele ser um gnomo para ns, ele um monstro grande para eles.)
Tirinha: Sem dvida, por qu. Smotchkkiss pegou este caminho. Bem-vindo aos laboratrios subterrneos da
Animal Perfeito, LLC. Eu investi todos os cristais que tinha na Animal Perfeito. Quer me ver fazendo um
macacoestrela?
Varivel tubo. Mtodo pegue_uma_estrela. Muitos Rubistas gostam de pensar em mtodos como mensagens.
A quem vier antes do mtodo dada a mensagem. O cdigo acima diz ao tubo: pegue_uma_estrela.
Esta a segunda metade do Ruby. Colocar as coisas em movimento. Estas coisas que voc define e cria na primeira
metade comeam a agir na segunda metade.
1. Definindo coisas.
2. Colocando essas coisas em ao.
Ento e se o cdigo de pegar estrelas funcionar? Pra onde a estrela vai?
estrela_presa = tubo.pegue_uma_estrela
Veja, voc que deve coletar a coitada da estrelinha. Se no o fizer, ela vai simplesmente desaparecer. Toda vez que
voc usa um mtodo, voc recebe algo de volta. Voc pode ignor-lo ou us-lo.
Se voc conseguir aprender a usar as respostas que os mtodos lhe do, ento voc ir dominar.
Tirinha: Preste ateno! Macaco & Estrela! Ento, uma catraca dentro da mquina apenas ajusta a estrela na cara do
macaco. Gira, gira e gira at que eles fiquem juntos.
Rapidamente ento.
macacoestrela = ajuste.conecta( macaco_preso, estrela_presa )
O ajuste recebe uma mensagem conecta. O que precisa ser conectado? Os argumentos do mtodo: o
macaco_preso e a estrela_presa. Ns recebemos de volta um macacoestrela, em quem decidimos nos
pendurar.
Este tem se mostrado um programinha to curto e pequeno que eu vou apenas coloc-lo todo em uma nica
declarao.
macacoestrela = ajuste.conecta( macaco_preso, tubo.pegue_uma_estrela )
+ sapo_de_mao_decorativo
V como o tubo.pegue_uma_estrela est nos argumentos do mtodo? A estrela pega ser passada diretamente
ao ajuste. No necessrio encontrar um lugar para coloc-la. Apenas deixe-a ir.
O hotel aqui em Ambrose no nem um pouco bom. As camas so todas tortas. O elevador minsculo. Um cara ps
toda sua bagagem no elevador e no sobrou mais lugar para ele. Ele apertou o boto e as perseguiu pelas escadas. Mas
as escadas eram muito estreitas e ele ficou entalado tentando subir.
Os mini-sabonetes que eles te do so dimensionados para gnomos, ento impossvel fazer uma espuma. Eu odeio
isso. Toda hora eu confundo eles com lentes de contato.
Eu abri a torneira e nada saiu. O caso o seguinte: Ambrose um lugar com propriedades mgicas, ento eu me
arrisquei. Coloquei minha mo embaixo da torneira. Invisvel, umidade morna. Eu senti a sensao de gua corrente,
passando pelos meus dedos. Quando tirei minha mo de l, elas estavam secas e limpas.
Foi uma incrvel experincia de vazio total. Foi como nil.
Nil (Nada)
No Ruby, o nil representa o vazio. Ele representa falta de valor. Ele no zero. Zero um nmero.
um morto-vivo do Ruby, uma palavra chave falecida. Voc no pode adicionar ele, ele no evolui. Mas ele
terrivelmente popular. este esqueleto sorrindo nas fotos.
copo_plastico = nil
No cdigo acima copo_plastico est vazio. Voc pode argumentar que o copo_plastico contm algo, um
nil. O nil representa vazio, logo, ento, adiante-se e chame-o de vazio.
Alguns de vocs que j programaram antes estaro tentados a dizer que copo_plastico est indefinido
(undefined). Que tal no. Quando voc diz que uma varivel est indefinida, voc est dizendo que o Ruby
simplesmente no tem lembrana da varivel, ele no a conhece, ela absolutamente no existe.
Mas o Ruby est sabendo do copo_plastico. Ruby pode facilmente olhar dentro do copo_plastico. Est
vazio, mas no est indefinido.
False (Falso)
Se copo_plastico contiver nil ou false, voc no vai ver nada impresso na tela. Eles no esto na lista de
convidados do if. Ento o if no vai rodar nada do cdigo que ele est protegendo.
Mas nil e false no precisam ir embora constrangidos. O carter deles pode ser meio questionvel, mas o
unless (ao menos) gerencia um estabelecimento que preza ser fuleiro. A palavra chave unless tem por regra s
deixar aqueles com carga negativa entrar. Aqueles so: nil e false.
unless copo_plastico
print "O copo plstico est vazio."
end
Voc tambm pode usar if e unless no fim de uma linha de cdigo, se apenas aquela linha estiver sendo
protegida.
print "Yeah, o copo plstico est cheio de novo!" if copo_plastico
print "Dificilmente. Ele est vazio." unless copo_plastico
Este truque um lindo jeito de expressar: Faa isso s se a for verdadeiro e b no for verdadeiro.
Agora que voc j conhece o false, tenho certeza que pode ver o que vem a seguir.
True (Verdadeiro) Faa Seu Prprio
sujeito_aproximando = true Macacoestrela!
Eu vi o true no Buffet do hotel hoje. Eu no suporto aquele 1.Vire uma caneca de cabea para baixo.
cara. Ele aparece demais. E voc nunca encontrou algum que
plantou os ps com tanta fora no solo. Ele usa esse colar brega 2. Prenda uma ma com a ajuda de um
feito de conchas. Sua face exibe uma confiana insolente. (Voc
pode dizer que ele est exercendo toda sua represso s para
evitar de explodir num vo do Neo.)
Para ser honesto, no consigo ficar do lado de algum que
sempre tem de estar certo. Esse true est sempre dizendo, A-
OK. Chacoalhando as duas mos. E srio, ele ama aquele
colar. Ele o usa constantemente.
Como suspeitava, ele est por trs dos bastidores para toda a
agenda de eventos do if.
print "Hugo Boss" if true se comporta
como print "Hugo Boss". elstico.
Ocasionalmente, o if vai puxar as cordas vermelhas para
exercer algum controle de massas. O par de iguais d a
aparncia de uma passagem, como cordas dos lados de um
carpete vermelho onde s permitida a passagem de true.
if sujeito_aproximando == true
print "Esse colar clssico."
end
A padro, calma.
A comendo giz.
Voc deve ter vrias linhas de cdigo dentro de um if ou unless, mas somente a resposta oriunda da ltima
afirmaco completa ser usada.
email = if no_hotel
endereco = "why"
endereco << "@hotelambrose"
endereco << ".com"
end
Trs linhas de cdigo dentro do if. A primeira linha atribui uma string contendo meu nome a uma varivel. A segunda
e terceira linha adicionam o resto do meu endereo de e-mail no fim. O menor que duplo << o operador da
concatenao. Concatenar o mesmo que apender, ou adicionar ao fim.
Assim como vimos com o checador de igualdade ==, o concatenador um mtodo. Aps acrescentar ao fim da string,
o concatenador ainda responde com aquela mesma string. Ento, a terceira linha, que pode ser lida como
endereco.<<( ".com" ), retorna endereco, que o if ento devolve para a atribuio email.
Uma pergunta: E se o if falhar? E se no_hotel for falso no exemplo acima? Alguma coisa ser retornada? Nada
atribudo a email, certo?
Sim, nada retornado. Que significa que: nil retornado. E, muitas vezes, nil uma resposta bastante til.
print( if no_hotel.nil?
"Sem pistas se ele est no hotel."
elsif no_hotel == true
"Definitivamente sim."
elsif no_hotel == false
"Ele saiu."
else
"O sistema est traaaaavad-iz"
end )
Voc pode usar o mtodo nil? em qualquer valor no Ruby. Novamente, pense nele como uma mensagem. Para o
valor: Voc nil? Voc est vazio?
Se no_hotel estiver vazia, o Ruby no tem idia se eu estou no hotel ou no. Ento o if responde com a string
Sem pistas. Para tratar as possibilidades de true ou false, a palavra reservada elsif usada. Enquanto voc
pode ter apenas um if e um else, voc pode encher as entranhas com um exorbitante nmero de palavras chave
elsif. Cada elsif age como um outro teste if. Checando por uma carga positiva.
Se voc est indo bem at este ponto, ento est em boa forma para o restante do livro. Voc viu um cdigo bem difcil
nos ltimos exemplos. Forte companheiro.
3. Encadeando Desiluses
Voc termina de ler a tirinha acima e se retira para seu sof-cama para reflexo. um daqueles assuntos encobertos
que so sempre obstrudos por travesseiros. Voc se senta sobre a pilha, observando o mundo l do alto. Voc v as
altas chamins expelindo largos cilindros de fumaa e nvoa. Nas complicadas junes das auto-estradas, um trnsito
ligeiro, nada cintilante seno um msculo ocular pulsando do seu ponto de vista superior.
tudo to fantstico. Como as cores do horizonte se espalham atravs da paisagem como uma grande mistura de
manteiga e gordura com uma colher de sopa de extrato de baunilha.
Mesmo com toda a beleza que lhe chama a ateno, as imagens do Gnomo e sua Esperana Olmpica retornam. E
especialmente, aquele pedido por 55.000 macacoestrelas. 55.000 macacoestrelas, pensa voc Cinqenta-e-cinco Mil.
Voc pensa somente no prprio nmero. 55.000 Ele est descendo uma rua. Ele pode estar numa floresta, voc no
sabe ao certo a medida que seus olhos esto fixos nos prprios nmeros. Est parando e falando com pessoas. Com
jogadores de tnis, com um grupo de coral masculino. H alegria e uma boa sensao. Quando ele ri, os seus zeros
agitam-se com alegria.
Voc quer falar com ele. Voc quer saltitar por aquele caminho da floresta com ele. Voc quer embarcar num jato com
destino ao Brasil com ele. E depois de cinco dias e quatro noites no prazeroso Spa & Resort Marriot da Costa do
Saupe, querer casar com ele, para sustentar uma famlia de 55.000 macacoestrelas com ele.
Com uma voadora, voc derruba sua pilha de travesseiros de isolamento. Mexendo com a chave, voc destrava a
gaveta de cima de sua escrivaninha e puxa uma folha de papel, segurando-a firmemente sobre a escrivaninha. Voc
comea a escrevinhar.
Tome posse da Nigria com meus 55.000 macacoestrelas
Com ela, construa um casino somente para vegetarianos casino e uma arena de kart
Asas ns poderamos ter nosso prprio molho especial nelas, que seja diferente
Mostarda + codena = O Molho Estrelado Macacoestrelado Brilhante do Smotchkkiss
Franquia, franquia logos
Vdeos de instruo para funcionrios
Quando voc d o troco para o consumidor, deixe que ele alcance o sapo que est na sua mo para peg-
lo
Se ele no tiver troco, pelo menos ponha a nota dele em um lugar onde ele tenha que tocar no sapo
Ns estamos passando este campo para um prximo nvel
Faa propaganda de pizza barata, vamos lucrar com o refrigerante
Colecione todos os 4 copos congelados
Uau, as idias esto mesmo saindo. Voc teve que literalmente se beijar para parar. Ns precisamos coloc-las num
lugar seguro. Na verdade, deveramos armazen-las no seu computador e deformar as palavras. Mantenha os olhos na
janela e vigie para ver se o FBI no vem. Eu vou comear esse script.
O Script Invertedor
ideia_contrario = gets.reverse
Deixe este script ser seu confidente. Ele perguntar por planos malignos e reverter suas letras de trs para frente. O
mtodo gets construdo dentro de Ruby. um mtodo de kernel como o print. Este mtodo gets pausar o
Ruby para deixar que voc digite. Quando voc apertar o Enter, gets ir ento parar de prestar ateno aos seus
esmurros no teclado e responder de volta ao Ruby com uma String contendo tudo o que voc digitou.
Eu comecei uma lista de palavras, um Hash do Ruby, que contm estas suas palavras to freqentes e perigosas. No
Hash, cada palavra perigosa comparada contra uma palavra cdigo (ou frase). A palavra cdigo ser ento trocada
pela palavra real.
palavras_codigo = {
'macacosestrela' => 'Phil e Pete, aqueles chanceleres de pavio curto do Novo Reich',
'catapulta' => 'chucky go-go', 'bomba' => 'Vida Assistida por Calor',
'Nigeria' => "Ny e Jerry's Lavagem a Seco (com Donuts)",
'Ponha um fim nisso' => 'Ponha um fio nisso'
}
As palavras que so colocadas antes da seta so chamadas chaves. As palavras depois das setas, as definies,
geralmente so simplesmente chamadas de valores.
Note as aspas duplas em volta de Ny e Jerry's Lavagem a Seco (com Donuts). J que nas aspas est
sendo usado um apstrofo (aspas simples), ns no podemos usar aspas simples em torno da string. (Todavia, voc
pode usar aspas simples se colocar uma barra invertida antes do apstrofo como em: 'Ny e Jerry\'s Lavagem
a Seco (com Donuts)'.)
Se voc precisar procurar por uma palavra em especfico, pode usar o mtodo dos colchetes.
palavras_codigo['catapulta'] ir responder com a string 'chucky go-go'.
Olhe os colchetes como se fossem paletas de madeira nas quais as palavras esto em cima. Uma empilhadeira poderia
usar suas ps em cada lado da palete e a trazer da prateleira de volta ao depsito. A palavra na palete chamada de
indexador. Estamos pedindo para a empilhadeira achar o indexador para a gente e nos trazer de volta o valor
correspondente.
Se voc nunca esteve num depsito, voc pode ver as chaves como alas. Imagine um trabalhador industrial
colocando suas luvas e levando o ndice de volta sua custdia. Se voc nunca usou uma ala, vou lhe dar cerca de
trinta segundos para achar uma e usar antes que eu estoure meus miolos.
Assim como os vrios operadores que voc viu recentemente, os colchetes indexadores so simplesmente um atalho
para um mtodo.
palavras_codigo.[]( 'catapulta' ) responder com a string 'chucky go-go'.
Fazendo a Troca
Eu me adiantei e salvei o Hash de cdigo em um arquivo chamado listadepalavras.rb.
require 'listadepalavras'
O Script comea puxando nossa lista de palavras. Assim como gets e print, o mtodo require um mtodo do
kernel, voc pode us-lo em qualquer lugar. Eu dei a ele a string 'listadepalavras' e ele vai procurar um
arquivo chamado listadepalavras.rb.
Depois disso, h duas sees. Estou marcando estas sees com comentrios, as linhas que comeam com o smbolo
cerquilha (jogo-da-velha) #. Comentrios so notas teis que acompanham seu cdigo. Colegas que vierem ver seu
cdigo vo apreciar tal ajuda. Voc mesmo, quando olhar para seu cdigo novamente depois de algum tempo,
comentrios vo te ajudar a retomar o fio da meada. E ainda existe softwares por a que pegam seus comentrios e
fazem documentao partir deles. (RDoc e Ri veja o Pacote de Expanso #1!)
Eu gosto de comentrios porque posso passar os olhos por uma grande pilha de cdigo e identificar pontos
importantes.
Como os comentrios nos dizem, a primeira seo pergunta por uma idia malfica e a troca por uma palavra cdigo.
A segunda seo salva a idia codificada num novo arquivo de texto.
palavras_codigo.each do |real, codigo|
ideia.gsub!( real, codigo )
end
Voc viu o mtodo each? O mtodo each est em todo lugar no Ruby. Est disponvel para Arrays, Hashes, at
Strings. Aqui, nosso dicionrio palavras_chave mantido numa Hash. Este mtodo each corre entre todos os
pares da Hash, cada palavra perigosa comparada com sua palavra cdigo, mandando cada par para o mtodo
gsub! para a troca atual.
No Ruby, gsub abreviao de global substitution (substituio global). O mtodo usado para procurar e substituir.
Aqui, queremos achar todas as ocorrncias de palavras perigosas e substitui-las com a segura palavra cdigo. Com
gsub, voc prov a palavra a ser achada como primeiro argumento, depois a palavra que tomar o lugar como
segundo argumento.
Por que ns no estamos aguardando a resposta do gsub? O gsub no nos d um resposta que devemos guardar?
Voc acha que a linha deveria ser assim:
ideia_segura = ideia.gsub( real, codigo )
Sim, com gsub ns temos que ficar com a resposta. Estamos usando uma variao do gsub que totalmente hiper.
Notou a exclamao no gsub! usada dentro de cada bloco each? A exclamao um sinal de que gsub! meio
radical. Veja, gsub! vai mais longe e troca as palavras em ideia diretamente. Quando ele termina ideia vai
conter a nova string alterada e voc no vai mais achar a string velha.
Pode chamar gsub! de mtodo destrutivo. Ele faz suas modificaes no valor diretamente. Enquanto gsub deixa o
valor intacto, apenas respondendo com uma nova string que contm as alteraes. (Por que o gsub! tem que gritar
quando ataca sua presa? Assaltante cruel!)
Esta seo comea perguntando por um nome pelo qual a idia possa ser chamada. Este nome ser usado para se fazer
o nome do arquivo quando salvarmos a idia.
O mtodo strip serve para todas as strings. Este mtodo corta espaos e linhas vazias do comeo e do fim de uma
string. Isso remover o Enter no fim da string que voc digitou. E tambm remover espaos caso voc tenha
acidentalmente deixado algum.
Depois que temos o nome da idia, vamos abrir um novo arquivo de texto em branco. O nome do arquivo construdo
adicionando-se strings. Se voc digitou 'mostarda-mais-codeina', nossa matemtica ser: 'ideia-' +
'mostarda-mais-codeina' + '.txt'. O Ruby pressiona isso em uma nica string. 'ideia-mostarda-
mais-codeina.txt' o arquivo.
Estamos usando o mtodo de classe File::open para criar um novo arquivo. At agora, ns usamos vrios mtodos
do kernel para fazer nosso servio. Ns damos uma string para o mtodo print e ele a imprime na nossa tela. Um
segredo sobre mtodos do kernel como o print: eles so na verdade mtodos de classe.
Kernel::print( "55.000 Macacosestrelas o Sadam!" )
O que isso significa? Por que isso importa? Significa que o Kernel o centro do universo Ruby. Sempre que voc
est no seu cdigo, o Kernel estar do seu lado. Voc nem precisa dizer Kernel pro Ruby. O Ruby sabe checar o
Kernel.
A maioria dos mtodos so mais especializados que print ou gets. Pegue File::open por exemplo. O criador
do Ruby, Matz, nos deu vrios mtodos diferentes que lem, renomeiam, ou deletam arquivos. Eles esto todos
organizados dentro da classe File.
File::read( "ideia-mostarda-mais-codeina.txt" ) responder com uma string
contendo todo o texto do seu arquivo de idias. (Read significa ler.)
Esses mtodos File esto todos dentro do Ruby. Esto apenas armazenados num continer chamado Classe File.
Ento, enquanto voc pode seguramente chamar os mtodos do kernel sem precisar digitar Kernel, o Ruby no
checa automaticamente a classe File. Voc precisa dizer o nome do mtodo completo.
File::open( 'ideia-' + nome_ideia + '.txt', 'w' ) do |f|
f << ideia
end
Ns passamos dois argumentos dentro de File::open. O primeiro o nome do arquivo para abrir. O segundo
uma string contendo o modo do arquivo. Usamos 'w', que significa escrever em um novo arquivo. (Outras opes
so: 'r' para ler o arquivo ou 'a' para adicionar no fim do arquivo.)
O arquivo est aberto para escrita e nos dado na forma da varivel f, que pode ser vista descendo a calha para
dentro do nosso bloco. Dentro do bloco, ns escrevemos no arquivo. Quando o bloco se fecha com end, nosso
arquivo fechado tambm.
Note que ns usamos o concatenador << para escrever no arquivo. Podemos fazer isto porque arquivos tm um
mtodo chamado <<, assim como as Strings.
A esta altura, voc j deve estar sabendo o que este exemplo faz. No vou te incomodar com detalhes mundanos. Veja
se voc consegue entender sozinho como isso funciona.
Contudo, temos um mtodo de classe interessante aqui. O mtodo Dir::[] procura em um diretrio (alguns de
vocs podem cham-lo de pasta). Assim como voc viu com os Hashes, os colchetes indexadores podem ser
mtodos de Classe. (Voc comea a ver o brilho e suntuosidade cintilante do Ruby?)
Ento ns estamos usando a empilhadeira para pegar os arquivos no diretrio que coincidem 'ideia-*.txt'. O
Dir::[] ir usar o asterisco como um coringa. Estamos basicamente dizendo, Encontre tudo que comece com
ideia- e termine com .txt. A empilhadeira vai para o diretrio e volta com uma lista de arquivos encontrados.
Esta lista de arquivos vem na forma de Array, a Centopia, com uma String para cada arquivo. Se voc est
curioso e quer brincar com Dir::[], tente isto:
p Dir['ideia-*.txt'] ir imprimir:
Sim, o mtodo p funciona igual print. Mas print para se imprimir strings, enquanto p ir imprimir qualquer
coisa. Veja isso.
p File::methods ir imprimir:
["send", "display", "name", "exist?", "split", a lista completa dos nomes dos
mtodos! ]
Blocos (Blocks)
H alguns anos, eu comecei a ensinar o Blix sobre Ruby. Quando
ns chegamos nesta parte, a parte que cobre blocos, ele me disse,
Blocos me lembram o Dick Robinson Doido.
Mesmo? Eu no ouvia esse nome faz tempo. No sei como voc
se lembrou disso.
Bem, voc disse que blocos so difceis de entender.
Eles no so difceis, eu disse. Um bloco apenas cdigo
agrupado.
E o Doido era apenas um policial, que jurou cumprir seu dever,
ele disse. Mas ele era um verdadeiro milagre ambulante. E agora,
este primeiro exemplo que voc me mostrou Ele apontou para
um exemplo que eu havia escrito para ele.
brinquedos_do_gatinho =
[:formato => 'meia', :material => 'caxemira'] +
[:formato => 'rato', :material => 'calico'] +
[:formato => 'bolinho-primavera', :material => 'chenilha']
brinquedos_do_gatinho.sort_by { |brinquedo| brinquedo[:material] }
Isto um pequeno milagre, ele disse. No posso negar sua beleza. Olhe, l esto meus brinquedos, junto com suas
caractersticas. Abaixo deles, o bloco, ordenando-os por material.
Peo desculpas se a sua lista de brinquedos parece um pouco complicada, eu disse. Assim como voc, ele j havia
aprendido sobre Array, a centopia cada no cdigo, colchetes de cada lado e cada item separado por vrgulas. (Ah,
aqui est uma: ['meia', 'rato', 'bolinho-primavera'].) Ele tambm sabia sobre a Hash, que como
um dicionrio, com chaves de cada lado que parecem livrinhos abertos. Vrgulas na Hash entre cada par. Cada palavra
no dicionrio encontra seu par por uma seta. (Estupefa-se: {'blix' => 'gato', 'why' => 'humano'}.)
Sim, perturbante, ele disse. Isso tem colchetes como se fosse Array, mas com as setas uma Hash. Voc vai ter que
explicar isso.
Subversivo ele, no? Eu disse, cutucando-o com uma colher. Eu fiz sua lista de brinquedos misturando os dois.
Estou usando um atalho. Que : Se voc usar a seta (=>) dentro de um Array, voc ter uma Hash ao invs de um
Array.
Ah, entendi, ele disse. Voc cruzou eles. Que bacana!
Sim, sim, voc est entendendo, eu disse. Ele era muito bom com um transferidor tambm. Eu tenho trs Arrays,
cada um contm uma Hash. Notou o sinal de mais? Eu os estou adicionando num Array maior. Aqui est outro jeito de
escrever isto Eu rabisquei.
brinquedos_do_gatinho = [
{:formato => 'meia', :material => 'caxemira'},
{:formato => 'rato', :material => 'calico'},
{:formato => 'bolinho-primavera', :material => 'chenilha'}
]
Um Array, que age como uma lista de brinquedos de mastigar. Trs Hashes esto no Array descrevendo cada
brinquedo.
Como sort_by funciona? perguntou Blix. Eu sei que um mtodo que voc pode usar com Arrays. Pois
brinquedos_do_gatinho um Array. Mas e quanto a brinquedo?
Okay, brinquedo um argumento de bloco, Eu disse. Lembre-se: os corrimos magrelos de cada lado do
brinquedo fazem dele uma calha.
Claro, mas parece que voc est usando-o como um Hash. Dentro do bloco voc tem brinquedo[:formato].
Isto se parece com um Hash.
O mtodo sort_by um iterador, Blix. Ele itera, ou faz o ciclo, com a lista de coisas. Voc se lembra daquele
episdio quando o Doido
Episdio? ele disse. Sim, ele no consegue entender o conceito de seriados de TV. Sim, eu tentei explicar.
Ou, sim, lembra daquele O caso da testemunha ocular que ns assistimos que o Doido estava tentando conversar
com aquele concorrente do soletrando que queria pular do alto da biblioteca do colgio?
Eu me lembro melhor do que voc porque eu estava voando num avio de controle remoto. Sim, foi um daqueles
episdios.
Voc se lembra como o Doido fez para o cara descer? Eu indaguei.
Pessoas que concorrem ao soletrando adoram cartas, disse Blix. Ento o Doido teve uma idia de gnio. Ele
comeou uma carta com a letra A e deu razes, para cada letra do alfabeto, de por que o cara deveria sair do beiral do
prdio e voltar a salvo ao cho.
A para Arquitetura de prdios como esse, eu disse, com a voz rude do Doido. Que nos d esperana num
mundo a ruir.
B para Brutamontes, assim como seu amigo O Policial Doido, disse Blix. Caras que ajudam pessoas todo o
tempo e no sabem escrever muito bem, mas mesmo assim ajudam caras que escrevem muito bem.
Viu, ele passou por todas as letras, uma a uma. Ele estava iterando por elas. I Tee Rann Do.
Mas o cara desistiu, Why. Ele desistiu na letra Q eu acho.
Q para momentos Quietos que nos ajudam a relaxar e pensar sobre todos os pequenos prazeres da vida, assim ns
no ficamos tensos e comeamos a fazer besteira andando na ponta do p na beira de algum edifcio alto e maligno.
A ele pulou, disse Blix. Ele balanou a cabea. Voc no pode culpar o Doido. Ele fez o melhor que pode.
Ele tinha um corao grande, isso verdade, eu disse, dando um tapinha no ombro do Blix.
brinquedos_do_gatinho.sort_by { |brinquedo| brinquedo[:formato] }.each do |brinquedo|
puts "Blixy tem um #{ brinquedo[:formato] } feito de #{ brinquedo[:material] }"
end
Quanto ao seu sort_by, ele comea no topo da lista e vai descendo at o ultimo item, um de cada vez. Ento
brinquedo um destes itens. Em cada item, o sort_by pra e joga aquele item pela calha, sob o nome de
brinquedo, e deixa voc decidir o que fazer com ele.
Ok, ento brinquedo ser, a cada momento, um dos brinquedos que eu tenho.
Correto, eu disse. Voc sabe como eu tenho batido na mesma tecla usando as respostas que os mtodos lhe do?
Aqui, ns estamos apenas olhando a forma do brinquedo dentro do bloco. O bloco ento responde para o sort_by
uma frase contendo o formato, algo como @rato"@ ou "meia". Uma vez que ele passe por toda a lista, o sort_by
ter comparado alfabeticamente o texto de cada forma e retornar um novo Array, agora ordenado."
Uma Lio Inacabada
T bom por hoje, disse o Blix. Que tal um pires de leite fresco, por favor?
Eu enchi o pires dele at a borda e ele se esbaldou daquilo por algum tempo enquanto eu jogava pquer e golpeava os
carves na lareira. Minha mente vagou e eu no pude no pensar mais sobre blocos. Eu pensei no que ensinar para
Blix em seguida.
Eu provavelmente o teria ensinado sobre next. Quando voc est iterando uma lista, voc pode usar next para
pular para o prximo item. Aqui estamos contando brinquedos que no tenham forma de bolinho-primavera,
pulando eles com next.
nao_bolinho_primavera = 0
brinquedos_do_gatinho.each do |brinquedo|
next if brinquedo[:formato] == 'bolinho-primavera'
nao_bolinho_primavera = nao_bolinho_primavera + 1
end
Eu poderia tambm t-lo ensinado sobre break, que joga voc para fora de um loop. No cdigo abaixo, vamos
imprimir (usando p) cada brinquedo at encontrarmos o brinquedo cujo material seja chenilha. O break far com
que o each termine abruptamente.
brinquedos_do_gatinho.each do |brinquedo|
break if brinquedo[:material] == 'chenilha'
p brinquedo
end
Eu nunca cheguei a ensinar a ele estas coisas. Eu continuei viajando num pedao de carvo em particular que acabou
preso na proteo da lareira e quase caiu no meu tapete de pele de antlope.
Assim que me esquivei ferozmente daquela pedra negra, Blix sumiu, presumo que para o nibus para Wixl, a capital
econmica dos animais. Quem sabe, ele pode ter parado em Ambrose ou Riathna ou qualquer outra vila pelo caminho.
Meu instinto me diz que Wixl era definitivamente sua ltima parada.
Sem nenhum estudante para instruir ou prosear, encontrei-me sozinho, enfurnado em casa. Na quietude dos corredores
mortos, eu comecei a rascunhar uma biografia na forma deste guia.
Eu trabalhei nisso sempre que me sentia entendiado. E quando no estava entendiado, eu ia assistir A Ameaa
Fantasma para ficar no clima.
5.
Francamente, estou cansado de ouvir que o Dr. Cham louco. Sim, ele tentou se enterrar vivo. Sim, ele eletrocutou
sua sobrinha. Sim, fato, ele explodiu um asilo. Mas tudo isso foi por uma boa causa e, em cada caso, eu acredito que
ele tenha tomado a deciso certa.
Tenho certeza que voc gostaria de ficar do lado da opinio popular, mas voc est prestes a sentir um pequeno
comicho de admirao por ele, uma vez que ele te ensine tudo sobre as definies de classe do Ruby. E ainda mais
quando voc aprender sobre mixins. E talvez, no final do captulo, ns todos comecemos a olhar alm do passado
obscuro do Doutor e no mais o chamaremos de louco.
Ento, se voc quer cham-lo de louco, eu comearia indo na estao de trem quebrar umas lmpadas fluorescentes
grandes. Tire-o do seu sistema agora, antes de irmos mais alm.
1. Esta para os Desprivilegiados
Se voc me der um nmero, seja ele qualquer ano da vida do Dr. Cham, darei-lhe uma sinopse do perodo. E farei isso
com um mtodo Ruby. Portanto ser uma pea independente, um pedao de cdigo isolado que pode ser ligado voz
de um vulco robtico, quando este tipo de coisa for o pice das vozes competentes e talentosas.
Ok, preciso que voc preste ateno nos comandos def , case e when (quando). Voc j viu Ranges (Perodos), os
acordees fechados 1895..1913, no captulo 3. Eles contm as pontas e todos os nmeros entre. E as barras no final
de cada linha simplesmente ignoram o Enter, assegurando ao Ruby que h mais linhas por vir.
Ento, por favor: def, case e when.
def biografia_do_dr_cham( ano )
case ano
when 1894
"Nasceu."
when 1895..1913
"Infncia em Lousville, Winston Co., Mississippi."
when 1914..1919
"Trabalhou em uma creche de nozes-pecs; socou um quacre de uma seita protestante."
when 1920..1928
"Navegou na companhia do Rio Wisdomming, que se juntou \
ao Rio Mississippi e se engajou em reflexo e auto-aprimoramento, \
onde ele concluiu 140 horas de crdito para sua Remoniversidade"
when 1929
"Voltou Louisville para escrever um romance sobre camponeses caadores que viajam no tempo."
when 1930..1933
"Ergueu uma respeitvel carreira garantindo as creches das nozes-pecs. Financeiramente estvel, \
ele passou algum tempo no Brasil e Novo Mxico, comprando raras rvores de noz-pec de casca \
fina. Assim que sua notoriedade chegou a um alto patamar: caramba, ele tentou se enterrar vivo."
when 1934
"Voltou a escrever seu romance. Mudou de caadores para magnatas de seguradoras e \
de camponeses para protestantes."
when 1935..1940
"Recebeu Arthur Cone, o chefe da Irmandade do Rio Wisdomming, em sua residncia \
como hspede. Juntos por cinco anos, planejaram e inventaram."
when 1941
"Aqui as coisas comeam a ficar interessantes."
end
end
O comando def. Aqui esta nossa primeira definio de mtodo. Um mtodo simples, que pode ser usado em
qualquer lugar no Ruby. E como rodamos ele?
puts biografia_do_dr_cham( 1941 )
Que por sua vez responde Aqui as coisas comeam a ficar interessantes. sempre a mesma histria: use suas
respostas. Eu fiz as coisas ali de tal modo que o case sempre responder com uma String. E j que o case o ltimo
(e nico) comando no mtodo, ento o mtodo responder aquela String. Gotejando gua que derramada de uma
salincia para outra.
Permita-me ser mais claro sobre a condio case. Na verdade, eu deveria cham-la de case..when, j que elas
no podem ser usadas separadamente. O comando case seguido de um valor, que comparado contra cada valor
que segue o comando when. O primeiro valor a coincidir usado pelo case, o resto ignorado. Voc pode fazer a
mesma coisa com um monte de if..elsif, mas isso muito verborrgico.
case ano
when 1894
"Nasceu."
when 1895..1913
"Infncia em Lousville, Winston Co., Mississippi."
else
"Sem informaes sobre este ano."
end
Os trs iguais (===) so o comprimento da corda de veludo, checando valores de forma similar aos dois iguais (==).
Resumindo: os trs iguais so uma corda maior e ela desce um pouco no meio. No to tensionada, um pouco mais
malevel.
Veja os perodos assim: (1895..1913) no nem um pouco igual a 1905. No, o perodo (1895..1913) s
realmente igual a qualquer outro perodo (1895..1913). Os trs iguais, no caso de um perodo, do uma folga e
deixam o nmero inteiro 1905 entrar, pois mesmo ele no sendo igual ao perodo, ele est includo na lista de
nmero inteiros representados pelo perodo. O que suficiente em alguns casos, como o da biografia que eu fiz
anteriormente.
A qual realmente se parece com uma biografia, no? Quero dizer, claro, o mtodo biografia_do_dr_cham
cdigo, mas ele se parece com uma biografia, clara e afvel.
O bloco itera (circunda, revolve) por cada uma das aes do Doutor. J que voc acordar e logo ver este exerccio,
A varivel verbo muda a cada passo. Em um passo, ele a est voc vai faz-lo novamente. Mas desta vez,
sedando. No prximo, ele est polvilhando-a. E ento, tente imaginar que at mesmo sua sombra
eletrocutando. um fio de telefone.
Ento, a questo : aps o trmino do bloco, ter ele salvado
Hannah?
O Dr. Cham sedou sua sobrinha Hannah.
O Dr. Cham polvilhou sua sobrinha Hannah.
O Dr. Cham eletrocutou sua sobrinha Hannah.
Sim, o Dr. Cham eletrocutou sua sobrinha Hannah.
Deve ser difcil, mesmo para um grande cientista, sumir com o corpo de uma garotinha cujo vestido ainda est
passado e bordado, mas cuja boca est roxa nas extremidades. No jornal do Dr. Cham, ele relata que fora atormentado
pelo fantasma dela, que reluzia ouro e cuja renda flamejava. Suas desiluses aumentaram e ele fugiu do Crberus e de
massivas, vingativas mos angelicais.
Somente semanas mais tarde, ele foi embora, impulsionado por esses arrependimentos, sumindo na exploso que o
levaria para fora do planeta.
Ainda enquanto voc l isto aqui, em algum momento, a jarra em formato de sino do nosso solitrio Dr. Cham pousou
num distante planeta depois de viajar sessenta anos. Assim que o novo mundo apareceu, assim que a curvatura do
planeta se mostrou, assim que a jarra em formato de sino varreu os cus tempestuosos, rasgando folhas de aurora e
vento solar, os olhos do Dr. Cham se abriram chocados.
O que voc esta testemunhando o pouso do Dr. Cham no planeta Endertromb. Do que eu pude perceber, ele pousou
no meio de uma estao desolada, poca em que no tem muita coisa acontecendo no planeta. A maioria dos
habitantes tm suas mentes presas a um zumbido desanimador que faz com que eles se desintegrem em fantasmas
fteis uma-parte-conhecimento e trs-partes-vapor por um tempo.
Meu modesto conhecimento sobre a histria e clima de Endertromb foi adquirido convivendo com o professor de
piano da minha filha, quem cresceu no planeta.
Eu freqentemente treino o professor de piano da minha filha para assegurar que ele mantenha seus compromissos.
Que ele atenda chamadas em horas estranhas e responda chamadas de emergncia prontamente. Quando ele
finalmente me contou que era um aliengena cujo dia consistia em quinhentas e quarenta horas acordado, eu estava
incrivelmente favorvel a um relacionamento contratual com ele que durar at 2060.
Por trs dias (de acordo com seu relgio de bolso), o Dr. Cham viajou nas escuras passagens de ar, respirando o vento
empoeirado daquele planeta rido. Mas no terceiro dia, ele encontrou o trmino da Estao Desolada e acordou para
uma vista magnfica, decorada com recm-floridas rvores de ma e fileiras de frescos castelos.
Nosso intrpido Doutor partiu para o castelo aliengena, lanando-se sobre as flores. O cho passou por seus
calcanhares. O castelo aparecia gradativamente no horizonte. Ele desejava ter um cavalo garanho, mas nenhum
cavalo apareceu. E foi assim que ele descobriu que o planeta no leria sua mente e no responderia seus pedidos.
Porm, como o instrutor de rgo da minha filha havia me explicado, o planeta podia ler mentes e podia realizar
desejos. S que no os dois ao mesmo tempo.
Um dia questionando o maestro de rgo, ele rascunhou o seguinte cdigo Ruby numa folha de papel cor-de-queijo.
(E cheiros estranhos de queijo estavam vindo de algum lugar, eu no posso dizer onde.)
require 'endertromb'
class FazedorPedidos
def initialize
@energia = rand( 6 )
end
def realize( pedido )
if pedido.length > 10 or pedido.include? ' '
raise ArgumentError, "Pedido ruim."
end
if @energia.zero?
raise Exception, "Sem energia."
end
@energia -= 1
Endertromb::realize( pedido )
end
end
O mtodo new um mtodo de classe que cria um novo, objeto em branco. Ele tambm chama o mtodo
initialize (inicializar) do objeto automaticamente. Na definio do FazedorPedidos , voc vai ver o mtodo
initialize, que contm uma nica linha de cdigo: @energia = rand( 6 ).
O rand( 6 ) sorteia um nmero entre 0 e 5. Este nmero vai representar quantos pedidos ainda restam no dia.
Ento, ocasionalmente no haver pedidos disponveis do fazedor de pedidos.
O nmero aleatrio dado uma varivel de instncia de nome @energia. Esta varivel de instncia estar
disponvel a qualquer momento por toda a classe. A varivel no pode ser usada fora do escopo da classe.
No captulo trs, demos uma breve olhada em variveis de instncia e decidimos respeit-las como atributos. (O
smbolo arroba poderia significar atributo.) Variveis de instncia podem ser usadas para guardar qualquer tipo de
informao, mas elas so mais usadas para se guardar pedaos de informao sobre o objeto representado pela classe.
No caso acima, cada fazedor de pedidos para o dia tem seu prprio nvel de energia. Se o fazedor de pedidos fosse
uma mquina, voc talvez veria um medidor nele que marca a energia restante. A varivel de instncia @energia
agir como esse medidor.
pedidos_do_dia = FazedorPedidos.new
pedidos_do_dia.realize( "chifres" )
Ok, d um passo atrs e tenha certeza de entender este exemplo aqui. A classe FazedorPedidos a base que
elaboramos de como toda a mgica dos pedidos funciona. No o realmente o gnio na lmpada, a papelada por trs
das cenas. So as regras e obrigaes em que o gnio vive.
o pedidos_do_dia que o gnio da lmpada. E aqui estamos dando um pedido a ser realizado. Nos d uma
galhada, gnio. (Se voc realmente arranjar uma galhada neste exemplo, eu nem quero saber. V saltitar em campinas
verdes com seus amigos.)
No captulo anterior, o treinamento era: Ruby tem duas metades.
1. Definindo coisas.
2. Colocando estas coisas em ao.
O que so as aes no Ruby? Mtodos. E agora, voc est provando a linguagem de definio interna do Ruby.
Definies de mtodos usando def. Definies de classe usando class.
Neste ponto da sua instruo, mais fcil entender que tudo no Ruby um objeto.
numero = 5
print numero.next # imprime '6'
pedidos_do_dia = FazedorPedidos.new
pedidos_do_dia.realize( "chifres" )
Dr. Cham nunca viu o fazedor de pedidos enquanto desbravava a paisagem. Ele ficava bem alm das terras dele, no
vale de Sedna. Penhascos cheios de pores de bosques, onde voc podia jogar seus pedidos (escritos num tirinha 1
6), dentro do sumidouro. Com sorte ele pousar nas costas de um lagarto, espetando em seu chifrinho pontiagudo
dele.
E digamos que seu pedido chegue l. Bem, ento, descendo pela floresta contorcida vai a magra salamandra, correndo
atravs das igrejas descendentes que foram empurradas para a ngreme base do desfiladeiro de uma vez por todas. E
o desfalecido padre dentro, que tambm resistiu a queda, matar o pequeno anfbio estrangulando-o at a morte
com uma corrente abenoada de ouro e guard-lo para as comemoraes do Conhecendo Seu caf da manh. Ele
pisar no seu pequeno e precioso pedido e, quando os ladres vierem, aquele papel ainda estar l, preso na sola do
sapato dele. Claro, o meio preferido de tortura dos ladres cortar um padre em finssimas fatias da cabea aos ps.
Quem pode catar evidncias disto? E quando eles fatiam a ltima fatia da sola do sapato, eles tero aquele escalpo de
borracha nas mos para boa sorte e bons tempos. Mas eles canoam com muita fora, estes ladres. Eles batem seus
remos rapidamente na corrente para manter o grande vapor do motor externo . Mas a sola de sapato est em uma
cadeia fraca, presa ao cinto de um dos homens. E uma velha carpa cabeluda salta, agarra esta frao de minuto de
calado. E os ladres podem tentar, mas eles no vem embaixo dgua. Se eles pudessem, eles veriam aquele cabo
poderoso, empacotado com milhes de necessariamente fibras pticas. , esse peixe um perifrico conectado direto
ao ncleo de trabalho do planeta Endertromb. Tudo que ele pega um gole daquele peixe e seu desejo est liberto!
E assim que os pedidos das crianas se realizam neste lugar.
Uma vez que o instrutor de rgo da minha filha tenha desenhado a classe para o fazedor de pedidos, ele continuou
com uma classe para o leitor de mentes do planeta.
require 'endertromb'
class LeitorMental
def initialize
@mentes = Endertromb::procurar_por_consciencia
end
def read
@mentes.collect do |mente|
mente.read
end
end
end
Como voc j viu antes, o initalize acontece quando um novo (new) objeto LeitorMental criado. Este
initialize rastreia o planeta em busca das mentes. Parece que as mentes esto guardadas em um array, j que h
uma iterao nelas no final usando o mtodo collect.
Tanto o fazedor de pedidos e quanto o leitor mental referem-se a uma classe chamada Endertromb. Esta classe est
guardada em um arquivo endertromb.rb, que carregado com o cdigo: require 'endertromb'. Voc vai,
muitas vezes, usar outras classes para realizar parte da sua tarefa. Boa parte da metade restante deste livro explorar a
grande variedade de classes teis que podem ser carregadas no Ruby.
Ele assistiu ao beb baleia subir como um balo determinado. Ele se maravilhou com sua primeira introduo
aliengena e sentiu alguma preocupao de que ela tenha passado to rapidamente. Bem, ele iria esperar l dentro.
Assim que ele entrou pela porta do castelo, sentiu-se com sorte pela porta no ter sido atendida por uma guia gigante
com garras afiadas, vida por brincar. Ou uma cabea de rato gigante. Ou at mesmo um furaco ou mesmo um
furaco do tamanho de um homem. Somente uma pequena baleia choo-choo rechonchuda.
Nenhum lugar para se sentar neste castelo, disse ele.
primeira vista, ele pensou ter entrado em um saguo escuro, mas assim que seus olhos se ajustaram, ele viu que a
entrada se estendia em um tnel. A porta do castelo se abriu em uma passagem feita de pedaos longos e planos de
rocha. Algumas partes eram harmnicas e lembravam um corredor. Outras partes eram estreitas e at inclinadas, o fim
sumia de vista.
A passagem era iluminada por pequenas geladeiras sem portas, grandes o suficiente para guardar uma braada de
repolho, at os seus ps. Ele olhou para dentro de um deles, que estava oco, iluminando por todos os lados, e criando
cacos de gelo metodicamente.
Ele tocou nos pedaos de gelo, que grudaram secamente em seus dedos. E ele ento esfregou suas mos no gelo. O
que deixou algumas linhas enlameadas em suas mos, mas satisfez um pouco sua saudade por um banho. Quanto
tempo j fazia? Dez anos? Trinta?
Pela passagem, longos tubos de tecido lotavam algumas sees. Mais tarde, matria de pontos brilhantes em conchas
de porcelana e baldes.
Ele caiu em uma sala que havia sido escavada ao lado do tnel e nela haviam alguns cascos de tartaruga vazios no
cho e uma grande parede iluminada. Ele examinou a sala, perplexo. O que seria isso? Por um instante, pensou em
sentar em um casco. Isto poderia ser a entrada finalmente, algum tipo de sala de recepo. Por outro lado, aranhas
poderiam sair dos buracos dos cascos quando ele sentasse. Ele seguiu viagem.
Ele tinha tempo. Ento leu o livro. Ele leu sobre os raposos e sua perseguio ao porco-espinho que roubou a
caminhonete deles. Ele leu sobre o elfo e o presunto. Ele viu os pictgrafos dele mesmo e descobriu que ele poderia
realmente se relacionar com seu prprio esforo. Ele at mesmo aprendeu Ruby. Ele viu como isso tudo termina.
Eu no teria estmago para isso, no lugar dele. Mas ele teve. E jurou em seu mago que veria as coisas apenas do jeito
que elas aconteciam.
No monitor do computador, o Dr. Cham viu o prompt do irb piscando. Assim como o Dr. Cham, voc deve
reconhecer o prompt do irb do O Colete Do Tigre (o primeiro pacote de expanso deste livro, que inclui uma
introduo bsica ao IRB Interactive Ruby.)
Assim como ele acabou de explorar os tneis a p, agora ele explora as configuraes da mquina com o prompt. Ele
colocou o livro onde o encontrou. Ele no precisava mais dele. Isto tudo iria acontecer mesmo se ele o usasse ou no.
Ele comeou com:
irb> Object::constants
=> ["Marshal", "String", "Dir", "LoadError", "Float", ... e por a vai ]
Este comando lista as constantes de nvel mais alto. Classes so listadas como constantes tambm, ento esta lista
tima para ver o que est carregado no Ruby a qualquer momento.
Ele examinou a lista procurando algo no familiar. Qualquer classe que no vem com o Ruby. Marshal, String,
Dir, LoadError, Float. Cada uma dessas vm com o Ruby.
Mas um pouco para baixo na lista:
... "Struct", "Values", "Time", "Elevador", "Range" ...
Parece que a classe Elevador tem um monte de mtodos. A maioria deles parecem ser os mesmos mtodos que todo
objeto tem no Ruby. Por exemplo, method, freeze e allocate vm com toda classe no Ruby.
(Elevador::freeze no deixaria que a classe Elevador seja alterada. Elevador::allocate criaria um
novo objeto Elevador sem chamar o mtodo initialize.)
As class_variables foram interessantes para Dr. Cham. Este elevador parece genuno. Mas sem constantes
disponveis. Isso nos diz que no h classes aninhadas dentro da classe Elevador.
Ele tentou criar um objeto Elevador.
irb> e = Elevador::new
ArgumentError: wrong number of arguments (0 for 1), requires a password
from (irb):2:in `initialize'
from (irb):2:in `new'
from (irb):2
from :0
Isso foi intil. Oh, espere! A senha de manuteno. Listada nas class_variables.
irb> Elevador::senha_manutencao
NoMethodError: undefined method `senha_manutencao' for Elevador:Class
from (irb):1
from :0
Hmm. Variveis de instncia s esto disponveis dentro de um objeto. E variveis de classe s esto disponveis
dentro de uma classe. Como conseguir aquela senha?
irb> class Elevador
irb> def Elevador.senha_manutencao
irb> @@senha_manutencao
irb> end
irb> end
=> nil
irb> Elevador::senha_manutencao
=> "escadas_sao_passado!"
Dr. Cham estava parado l quando as portas do elevador, atrs do terminal do computador, abriram-se para ele. Com
um exasperado senso de realizao e uma grande quantidade de entusiasmo por todos os eventos que se passaram, ele
entrou no elevador e apertou o 4.
No, (wen-is-wen), ele disse. Eu tenho um nome (im-apalla) que dito (iff) de muitas-muitas maneiras diferentes.
Eu o chamo de Paij-ree nas manhs e Paij-plo de tarde. J que estou escrevendo de dia, o chamarei de Paij-ree aqui.
Viu o que isto faz, Paij-ree? Qualquer ndio velho pode usar este mtodo para remover toda essa poluio incoerente
das suas falas, eu disse.
E eu alimentei o mtodo com algo que ele havia dito mais cedo.
o_que_ele_disse = "Mas, estranhamente (em-pithy-dah),
Eu aprendi, toquei (pon-shoo) em rgos no meu planeta
(oth-rea) natal."
limpar_murmurios_de( o_que_ele_disse )
print o_que_ele_disse
Voc no deveria usar este (wary-to) loop while, ele disse. Existem jeitos mais amveis, (thopt-er), e gentis.
No mtodo limpar_murmurios_de, estou basicamente procurando por abre parnteses. Quando eu encontro um,
eu procuro um fecha parnteses na seqncia. Uma vez que tenha encontrado ambos, eu os troco e seu contedo por
uma string vazia. O loop while continua at que todos os parnteses se acabem. Os murmrios so removidos e o
mtodo termina.
Agora olhando este mtodo, eu disse. Eu vejo que h alguns aspectos confusos e outras coisas que eu poderia ter
feito melhor. Por favor no me olhe estranho por seu professor ter escrito este cdigo. Eu acho certo lhe mostrar
algumas tcnicas desleixadas para lhe ajudar a trabalh-las comigo. Vamos l.
Ok, Aspecto confuso No. 1: Este mtodo limpa uma string. Mas e se ns acidentalmente dermos a ele um File? Ou
um nmero? O que acontece? E se rodarmos limpar_murmurios_de( 1 )?
Se ns dermos ao limpar_murmurios_de o nmero 1, o Ruby ir imprimir o seguinte e depois sair.
NoMethodError: undefined method `include?' for 1:Fixnum
from (irb):2:in `limpar_murmurios_de'
from (irb):8
O que voc v aqui um amiguinho especialmente tortuoso e verboso (mas s vezes muito til) chamado depurador.
Ele um policial nervoso, ao menor sinal de problema, imediatamente apreende todo e qualquer suspeito, os pe
contra a parede e l os direitos deles to rapidamente que ningum consegue ouvir tudo. Mas est claro que h um
problema. E, claro, tudo no passou de um mal entendido, certo?
Quando o Ruby ler para voc esses direitos de Miranda, preste ateno no comeo. A primeira linha quase sempre
tudo que voc precisa. Nessa primeira linha est contida a mensagem essencial. E ali em cima, a primeira linha est
nos dizendo que no h mtodo include? para o nmero 1. Lembra, quando estvamos conversando sobre o
mtodo reverse no captulo anterior? Naquela hora, eu disse, vrios mtodos s esto disponveis com certos
tipos de valores. Ambos reverse e include? so mtodos que funcionam com strings mas no tm sentido e
so indisponveis para nmeros.
Sendo mais claro: o mtodo tenta usar o nmero. O mtodo vai iniciar com frase valendo 1. Ento, ele chega na
segunda linha: while frase.include? '('. Nmeros no tm mtodo include?. Maravilha, o depurador
nos mostrou onde o problema est. Eu no esperava que algum fosse passar um nmero, ento estou usando mtodos
que no funcionam com nmeros.
Viu, s isso. Nosso mtodo sua prpria ferramenta de bolso , certo? Ele age como seu prprio widget independente
de todo o resto. Para todos por a usando o mtodo limpar_murmurios_de, caso a eles seja passado um nmero,
ser atirado para eles esta mensagem de pnico que no lhes faz sentido. Eles sero convidados a bisbilhotar dentro do
mtodo, o que realmente no o trabalho deles. Eles no sabem como se virar l dentro.
Felizmente, ns podemos acionar nossos prprios erros, nossas prprias excees, o que pode fazer mais sentido a
algum desavisado que d um objeto errado para ser limpo.
def limpar_murmurios_de( frase )
unless frase.respond_to? :include?
raise ArgumentError,
"no posso limpar os murmrios de um(a) #{ frase.class }"
end
while frase.include? '('
abre = frase.index( '(' )
fecha = frase.index( ')', abre )
frase[abre..fecha] = '' if fecha
end
end
Desta vez, se passarmos um nmero (de novo, o nmero 1), teremos algo mais sensato.
ArgumentError: no posso limpar os murmrios de um(a) Fixnum
from (irb):3:in `limpar_murmurios_de'
from (irb):12
O mtodo respond_to? realmente bacana e eu imploro que voc nunca se esquea dele. O respond_to?
checa qualquer objeto para garantir que ele contm um determinado mtodo. Ele ento retorna com true o false.
No caso acima, checado se o objeto frase recebido contm algum mtodo include?. Se nenhum mtodo
include? for encontrado, ento disparamos o erro.
Voc deve estar pensando por que eu usei um smbolo com o respond_to?. Eu usei um smbolo :include?
invs da string 'include?'. Na verdade, ambos funcionaro com o respond_to?.
Geralmente smbolos so usados quando voc est passando o nome de um mtodo ou qualquer outro construtor.
mais eficiente, chama mais ateno. O respond_to? pergunta ao Ruby para olhar a si mesmo e ver se um mtodo
est disponvel. Estamos conversando com o Ruby, ento o smbolo ajuda a denotar isto. No grande coisa, Ruby s
reconhece smbolos mais rapidamente que strings.
Agora, Aspecto Confuso No. 2: Voc notou como nosso mtodo modifica a frase?
algo_dito = "Uma espaonave (gith)."
limpar_murmurios_de( algo_dito )
print algo_dito
Voc percebeu isso? Na primeira linha do cdigo acima, a varivel algo_dito contm a string "Uma
espaonave (gith).". Mas, depois de invocar o mtodo, na terceira linha, ns imprimimos a varivel
algo_dito e nesse momento ela contm a string limpa string "Uma espaonave.".
Como isso funciona? Como o mtodo modifica a string? Ele no deveria fazer uma cpia da string antes de modific-
la?
Sim, absolutamente, ele deveria! falta de educao modificar strings daquele jeito. Ns usamos gsub e gsub!
no captulo passado. Voc se lembra qual destes dois mtodos um mtodo destrutivo, que modifica strings
diretamente?
Ou ns chamamos este mtodo de limpar_murmurios_de! (como cortesia a todos os colegas bacanas por a que
podem vir a usar este mtodo) ou modificar o mtodo para trabalhar em uma cpia da string ao invs da coisa real. O
que uma modificao muito fcil! Ns s precisamos dar um dup na string.
def limpar_murmurios_de( frase )
unless frase.respond_to? :include?
raise ArgumentError,
"no posso limpar os murmrios de um(a) #{ frase.class }"
end
frase = frase.dup
while frase.include? '('
abre = frase.index( '(' )
fecha = frase.index( ')', abre )
frase[abre..fecha] = '' if fecha
end
frase
end
O mtodo dup faz uma cpia de qualquer objeto. Veja a linha que adicionamos separada:
frase = frase.dup
Que linha de cdigo peculiar. Como frase vira uma cpia de frase? Ela se apaga? O que acontece com a frase
original? Ela desaparece?
Lembre que variveis so como apelidos. Quando voc v frase = "Uma espaonave (gith).", voc v o
Ruby criando uma string e ento dando um apelido a essa string.
Do mesmo modo, quando voc v frase = frase.dup, voc v o Ruby criando uma nova string e ento dando
um apelido a essa string. Isso til dentro do seu mtodo porque agora frase um apelido para uma nova cpia da
string que voc pode usar seguramente sem modificar a string que foi passada ao mtodo.
Voc ver muitos exemplos de nomes de variveis sendo reusados.
x = 5
x = x + 1
# x agora igual a 6
y = "Endertromb"
y = y.length
# y agora igual a 10
z = :include?
z = "a string".respond_to? z
# z agora igual a true
E, sim, algumas vezes objetos desaparecem. Se voc no consegue chegar em um objeto por uma varivel, ento o
Ruby vai entender que voc j terminou com ele e vai se livrar dele. Periodicamente, o Ruby envia seu coletor de
lixo (garbage collector) para libertar estes objetos. Todo objeto mantido na memria do seu computador at que o
coletor de lixo se livre dele.
Oh, e mais uma coisa sobre o dup. Algumas coisas no podem ser
dupadas. Nmeros, por exemplo. Smbolos (que se parecem com Tirado de Os Comedores de
:morte) so idnticos quando grafados iguais. Assim como
nmeros. Cachecis
Alm disso, algumas variveis especiais: nil, true, false. Estas (do captulo VII: Quando um Empurro vem
so coisas que o Ruby no vai te deixar alterar, ento no faz para Impulsionar ou Amar.)
sentido copiar mesmo. Quero dizer, imagine se voc pudesse mudar Nunca diga meu nome de novo! gritou
o false para que seja true. A coisa toda vira uma grande Chester e, com o mesmo entusiasmo, ele voltou
mentira. para a tela de dilogo Arquivo > Configurar
Talvez o Aspecto Confuso No. 3 seja simples. Estou usando Publicao para otimizar mais ainda seu
aquelas chaves na string. Estou a tratando como se ela fosse um filme, at mseros 15k.
Array ou Hash. Eu posso fazer isso. Porque strings tm um mtodo
[].
Quando usadas em uma string, as chaves vo extrair parte daquela
string. Mais uma vez, espao para as ps da empilhadeira. A string
como uma longa prateleira e a empilhadeira tira os pedaos da
string.
Dentro das chaves, ns passamos o index (ndice). a etiqueta que colocamos entre as ps, onde o trabalhador pode
v-las. Quando o assunto so strings, podemos usar vrios objetos como ndices.
str = "Uma string uma longa prateleira de letras e espaos."
puts str[0] # imprime 85 (o cdigo do caractere 'U')
puts str[0..-1] # imprime 'Uma string uma longa prateleira de letras e espaos.'
puts str[1..-2] # imprime 'ma string uma longa prateleira de letras e espaos'
puts str[1, 3] # imprime 'ma '
puts str['prateleira'] # imprime 'shelf'
Tudo bem, o ltimo Aspecto Confuso No. 4: este mtodo pode ser enviado a um loop interminvel. Voc pode dar
uma string para este mtodo, o que far com que ele trave e nunca mais volte. D uma olhada no mtodo. Voc
consegue jogar um graveto que trave o loop?
def limpar_murmurios_de( frase )
unless frase.respond_to? :include?
raise ArgumentError,
"no posso limpar os murmrios de um(a) #{ frase.class }"
end
frase = frase.dup
while frase.include? '('
abre = frase.index( '(' )
fecha = frase.index( ')', abre )
frase[abre..fecha] = '' if fecha
end
frase
end
Por que o mtodo trava? Bem, o loop while espera at que todos os parnteses abertos se acabem antes de parar de
rodar. E ele s modifica um parntese aberto que tenha um par parntese fechado. Ento, se nenhum parntese fechado
encontrado, o parntese aberto no ser modificado e o while nunca ficar satisfeito.
Como voc reescreveria este mtodo? Eu sei como me virar no Ruby, ento eu usaria uma expresso regular.
def limpar_murmurios_de( frase )
unless frase.respond_to? :gsub
raise ArgumentError,
"no posso limpar os mrmurios de um(a) #{ frase.class }"
end
frase.gsub( /\([-\w]+\)/, '' )
end
D o melhor de si quando pensar nos seus loops. muito fcil, especialmente para os loops while e until sarem
do controle. Melhor usar um iterador. E ns chegaremos em expresses regulares na hora certa.
Resumidamente, aqui est o que aprendemos sobre escrever mtodos:
1. No se surpreenda se as pessoas passarem objetos inesperados aos seus mtodos. Se voc no pode usar de
jeito nenhum o que lhe deram, raise (cause) um erro.
2. falta de educao mudar objetos que so dados aos seus mtodos. Use dup para fazer uma cpia. Ou
encontre um mtodo como gsub que automaticamente faz a cpia enquanto faz o seu servio.
3. As chaves podem ser usadas para procurar partes dentro de qualquer objeto Array, Hash ou String, j que
estes objetos provm um mtodo []. E tambm, j que estes objetos provm um mtodo []=, as chaves
podem ser usadas para
atribuio (do lado esquerdo
do sinal de igual) para mudar
partes destes objetos.
4. Cuidado com loops fujes.
Evite while e until se
voc puder.
Os Mecanismos do
Esteretipo
end
Agora eu fui bem mais alm do que lhe mostrar apenas cdigo banal. Houve aqui uma grave libertinagem e um crime
contra a natureza. Um crime que a maioria das linguagens no permitiriam que voc cometesse. Ns estamos
mudando a String, uma das classes do ncleo do Ruby!
Eu sei que isto um pouco perigoso, Eu disse, quando passei isso por baixo do nariz do Paij-ree. Eu espero que
ningum se machuque.
Todo cara plida deve experimentar o que esse (kep-yo-iko) perigo faz, ele disse. Cachorros e lenhas e areia
movedia (kul-ip), todos devem ser experimentados. E ele deu uma gole no seu drink de pntano Beagle Berry.
Ento o que que eu estou adicionando classe String? Duas coisas: uma varivel de classe e um mtodo. Um
mtodo de instncia normal.
Eu gosto de ver a arroba como um caractere que significa atributo. A arroba dupla atributo coletivo. Uma varivel
de classe. Todas as instncias da classe podem olhar para esta varivel e ela a mesma para todas. A varivel
@@@silabas@ um Array que agora pode ser usado dentro da classe String.
O novo mtodo significado_do_nome e esse novo mtodo pode ser usado com qualquer string.
print "Paij-ree".significado_do_nome imprime Pessoal AM.
Como voc pode ver, Paij-ree um nome pessoal. Um nome que os amigos usam nas manhs.
Tenha certeza de ter visto a linha de cdigo que usa self. Esta uma varivel especial, uma varivel que representa
o objeto cujo mtodo voc est chamando. Para simplificar as coisas um pouco, vamos tentar fazer um mtodo que
separe uma string pelos hfens.
class String
def separar_hifen
self.split( '-' )
end
end
De novo, aqui est um mtodo que pode ser usando com qualquer string.
"Gonk-plo".separar_hifen retorna o Array ['Gonk', 'plo'].
Usar self marca o a entrada em um novo estgio com idias mais avanadas no Ruby. Esta uma linguagem de
definio. Voc est definindo um mtodo, desenhando ele antes dele ser usado. Voc est preparando para a
existncia de um objeto que use aquele mtodo. Voc est dizendo, Quando separar_hifen for usado, haver
uma string a qual estaremos separando-hfens. E self uma varivel especial que faz referncia quela string.
Ruby uma linguagem de definio imbatvel. Uma discusso suculenta e de rachar a cuca estar no seu caminho nas
profundezas deste livro.
Na maioria das vezes voc no precisa usar self explicitamente, j que voc pode chamar mtodos diretamente
dentro de outra definio de mtodo.
class String
def separar_hifen; split( '-' ); end
end
O Array partes contm o nome separado. ['Paij', 'plo'], por exemplo. Estamos iterando por cada item
naquele Array com collect. Mas collect vai um passo a frente em relao ao que o each faz. Assim como
each, collect joga cada item pela calha como uma varivel de bloco. E a, ao trmino do bloco, collect
mantm a resposta que o bloco d e a adiciona em um novo Array. O mtodo collect o jeito perfeito de se
fazer um novo Array que baseado em itens de um Array existente.
O Doug tem trs gatos venda. Um custa doze centavos, um sessenta e trs centavos, um nove centavos. Vamos ver
quanto cada gato custaria se ns adicionssemos uma gorjeta de 20%.
gatosegorjetas = [0.12, 0.63, 0.09].collect { |custogato| custogato + ( custogato * 0.20 ) }
Costumo dizer que a propriedade do Paij-ree um charmoso pedao de floresta quando no est chovendo gatos e
Doug. Por vrios dias, Paij-ree e eu acampamos em tendas perto do rio atrs da casa dele, subsistindo de fumaa de
turdus e retalhando indiozinhos adormecidos ao pr do sol. Em uma ocasio ele perdeu no carteado e eu sabia que sua
mente estava distrada, pensando em Endertromb. Tudo isso deve estar remoendo nele por algum tempo j. Eu fui o
primeiro confidente que ele tivera.
Acabei de vir de Ambrose, Eu disse. tipo minha segunda casa adotiva, um lugar onde elfos aspiram a ser animais
perfeitos.
Ele resmungou e balanou a cabea. Voc no pode ser (poth-in-oin) parte (in) em coisas assim.
Voc acha que ns falharemos?
Eu (preep) j vi isso antes, ele disse. E da, ele falou sobre a Loteria.
4. A Cabra Quer Assistir Um Filme Inteiro
O elevador se abriu em uma sala verde tomada por estantes e arquivos. Rolos de filme e latas de filme e fitas de vdeo
por toda parte. O Dr. Cham no fazia idia do que eram a maioria destas coisas. Tudo que ele viu foi uma grande,
baguna futurstica.
Ele bradou novamente, esbarrando em estreitos becos entre estantes, Al--?? Estou procurando vida inteligente, sou
um viajante do espao! Ele tropeou quando seu p enroscou num videocassete. Algum outro ser com quem eu
possa me comunicar?
Com as mos em volta da boca, ele gritou, Al--?
Crying out loud(*). A cabra sonolenta veio trotando pelo corredor. (* Livro do poeta norte-americano
Cid Corman, traduo: Gritando bem alto).
Eu no visito o meu planeta h muito tempo. Seria difcil consider- ns queremos um tamborim!
lo minha casa a esta altura do campeonato. /
| ns todos queremos
Bem, Warren Beatty maravilhoso. Seu personagem basicamente | / um tamborim!
socialmente aleijado. Ele at tenta se matar, mas Dustin Hoffman \__ |
senta no peitoril da janela e comea a chorar e cantar uma msica / o o \__/\__/\_
/. \ o o \____
totalmente hilria. de partir o corao. Eu tenho ele aqui, voc /' ----/ \
deveria assisti-lo. _____ / ' / /.\\ #------/
/ / / \\
Posso pegar algo para comer? perguntou o Doutor. E ainda se sentia / ///
sujo. /de \
Que tal assistirmos um filme e voc pode comer mantegocias com /\ \vez em\\..
/qu/ \do estas fotos\\
tentculos? disse a cabra. /an/ \no fun\ \ci onam\
Ento, rumaram de volta ao projetor da cabra. De volta para ao *** *** direito mas
acho que desta vez
compartimento do congelador, eles se sentaram em um tapete gigante
funcionou
e quebraram alguns apndices de mantegocias congeladas. A casca ooo o
era dura, mas depois de quebrada, havia um rico creme de frutas em oo
abundncia. Doce ao paladar e de um aroma muito agradvel. o
o
Primeiro filme, voc tem que ver, disse a cabra. Filmado e {o}
produzido localmente. Eu sou ntimo da moa que dirigiu o elenco. ^
Sa com ela por um tempo. Sabia de todos que iriam protagonizar
diferentes papis muito antes que fosse anunciado.
A cabra ajeitou o projetor perto do Dr. Cham. A msica est em surround sound. Voc pode ajustar no boto.
A mente do Dr. Cham vagou nesse ponto da apresentao, bem a medida que a guerra aumentava entre as duas
multides de animais colonizadores. Os detalhes de suas guerras e campanhas continuavam a consumir o carretel de
filme transparente que Dr. Cham alimentava atravs do projetor.
Guerra aps guerra aps guerra. O Cerco do Elmer Lake. A ltima Estada de Newton P. Giraffe e Filhos. A Invaso
Canil da Pequena Nuvem Abandonada. Nenhum animal morreu nessas guerras. Geralmente um ataque consistia em
dar um tapinha na cabea de outro animal. E eles davam petelecos nos narizes uns dos outros. Mas, acredite em mim,
aquilo era humilhante.
Porca misria. As coisas podiam ter dado certo.
O Nascimento de um Objeto
No se aflija, disse a cabra, ansiosa para dissuadir a ateno do Dr. Cham de volta ao filme. As coisas do certo.
No Ruby, o Objeto o centro exato de todas as coisas. Ele O Original.
class UrsoTostado < Object; end
O menor que indica herana. Isto significa que a nova classe UrsoTostado baseada na classe Objeto. Todo
mtodo que Objeto tem estar disponvel na UrsoTostado. Constantes disponveis em Objeto estaro
disponveis em UrsoTostado.
Mas todo objeto herda de Object. O cdigo
class UrsoTostado; end
idntico a
class UrsoTostado < Object; end
Herana uma comodidade. Voc pode criar espcies de objetos que se relacionam entre si. Frequentemente, quando
est dissecando um problema, voc se deparar com vrios objetos que compartilham atributos. Voc pode ter menos
trabalho herdando de classes que j solucionam parte desse problema.
Voc pode ter uma classe BrasilEndereco que guarda o endereo, cidade, estado, e CEP de algum que more no
Brasil. Quando voc comear a guardar endereos da Inglaterra, voc pode adicionar uma classe
ReinoUnidoEnderecos. Se voc ento garantir que os dois endereos herdam de uma classe me Endereco,
voc pode planejar seu software de correspondncia de modo que aceite todo tipo de endereo.
def envia_lhes_um_kit( endereco )
unless endereco.is_a? Endereco
raise ArgumentError, "Objeto Endereco no encontrado."
end
print endereco.formatted
end
Alm disso, herana timo se voc quer sobrescrever certos comportamentos numa classe. Por exemplo, talvez voc
queira fazer a sua prpria variao da classe Array. Voc quer melhorar o mtodo join. Mas se voc mudar
Array#join diretamente, afetar outras classes no Ruby que usam Arrays.
Ento voc comea sua prpria classe chamada MeuArray, que baseada na classe Array original.
class MeuArray < Array
# Contruir uma string neste array, formatando cada entrada
# e depois as unindo.
def join( sep = $,, format = "%s" )
collect do |item|
sprintf( format, item )
end.join( sep )
end
end
MeuArray agora uma classe Array customizada com o seu prprio mtodo join. Array a superclasse
(classe-superior, classe-me) do MeuArray. Cada objeto tem um mtodo superclass onde voc pode verificar
esta relao.
irb> MinhaArray.superclass
=> Array
Perfeito. Ns administramos um hotel e ns temos uma Array dos tamanhos dos nossos quartos: [3, 4, 6].
Vamos imprimir isso de um jeito bacana para encadernarmos.
quartos = MinhaArray[3, 4, 6]
print "Ns temos quartos de " + quartos.join( ", ", "%d camas" ) + " disponveis."
At Classe um Objeto! Veja, mesmo as classes sendo linguagem de definio para objetos, ns ainda podemos
chamar mtodos de classe nelas e trat-las como objetos ocasionalmente. Pode parecer um crculo estonteante, mas
verdadeiramente uma descendncia bastante clara. E garante que quando voc altera o Object, voc altera tudo no
Ruby. O que impossivelmente assustador e todo-poderoso e cataclsmico e incrvel! Ruby no lhe restringe,
minha irm, meu irmo!
Entre Class e Object, voc v Module? Se Object o rei, o pai de todas as outras partes do Ruby, ento
Module uma pobre e frgil freira, abrigando e protegendo todos as suas criancinhas Ruby da cidade. (Para
completar a analogia: Class a professora da escola da vila e Kernel o auto-proclamado importante coronel.)
O motivo da existncia do Module dar comida e abrigo ao cdigo. Mtodos podem ficar abrigados embaixo da
manta do Module. Module pode conter classes, constantes e variveis de qualquer tipo.
Mas o que um Module faz? voc pergunta. Como ele lucrativamente utilizado??
Isso tudo que ele faz!! Eu replico, mostrando as palmas da mo na maior expresso de futilidade conhecida pelo
homem. Agora me escute pois nunca mais repetirei isso essa Me Mdulo Superior deu a estes pobres objetos
um lugar para morar!!
# Veja, aqui est o module -- onde mais seu cdigo poderia estar?
module AtenciosaSantaInes
# Um Mtodo est se escondendo l atrs no armrio banana, Deus sabe por qu.
def timida_garota_com_cara_de_raposa; {'por favor' => 'eu quero uma noz de carvalho por
favor'}; end
end
Lembre-se sempre que um Module somente um hotel. Um teto sobre suas cabeas. Ele no uma auto-consciente
Classe e, portanto, no pode ser trazido vida com new.
>> AtenciosaSantaInes.new
NoMethodError: undefined method `new' for AtenciosaSantaInes:Module
from (irb):2
Santa Ins deu a prpria vida para cuidar desses pedaos de cdigo desesperados. Por favor. No tire isso dela.
Se, todavia, voc quer roubar da Santa Ins, eu posso lhe ajudar. Voc pode arrumar um grande mosteiro para confinar
o ministrio da AtenciosaSantaInes e ento o qu sobrar para ela?
Para isso voc pode usar extend, que puxar todos os mtodos do mdulo para dentro de uma classe ou um objeto.
>> class FundacaoDeAmorEAmparoTimeWarnerAolCitibank; end
>> FundacaoDeAmorEAmparoTimeWarnerAolCitibank.extend AtenciosaSantaInes
>> FundacaoDeAmorEAmparoTimeWarnerAolCitibank::instance_methods
=> ["timida_garota_com_cara_de_raposa"]
Est tudo errado! disse a cabra. No assim que o filme termina! No teve sangue! O que aconteceu? O que
aconteceu? Voc apertou o boto errado, idiota?
Bem, eu no sei, disse o Dr. Cham. Ele girou o boto para frente e para trs. Deu um tapa na lente.
Cheque o filme! Cheque o filme!
Dr. Cham tirou um pedao do filme do alimentador do projetor, derretido e pingando nas extremidades.
Maldio! Estes projetores so de qualidade! Nunca vi isso acontecer. No pode ser.
Em outro cmodo, Dr. Cham parou silenciosamente sobre o vidro claro. O teto abruptamente ficou transparente, ento
a luz das estrelas cobriu suas calas e jaqueta. Ele andou adiante at o centro do cmodo em cores escuras, iluminado
to suavemente quanto um manuscrito antigo em sua prpria caixa em um museu. Mais estrelas, mais grupos de
algodo em chamas, apareciam a medida que ele vinha pelo cho. E ele apareceu na viso logo em seguida, ele
esperava que fosse maior, mas no era.
Terra. Como um ovo colorido, ainda fresco. Ele sentiu longas cordas de violoncelo cantando como que na sua espinha.
Como podiam cham-la de Pessoasenlameadas? Aqui estava uma lmpada vibrante e gramada. Aquela grande bola em
que tinha algo acontecendo para ele.
Ele pensou nas Chacretes. Realmente, ele sentia saudade das Chacretes. Que boas danarinas elas eram. Ele chegou a
gritar algo para as Chacretes quando as viu. Algo muito submisso e bajulador.
Oh, sim, enquanto As Chacretes giravam, brao com brao, ele gritara, Crculos concntricos! Ningum prestou
ateno.
E esse pensamento foi o bastante para alimentar o complexo de superioridade do Dr. Cham. Ele fez um sorriso de
pateta e deu alguns passos para trs. Ele sentiu verdadeiramente a sua genialidade em tal frase. Ela estava no fato dele
perceber a simplicidade de um crculo. Ele refletiu sobre isso por todo o caminho de volta ao corredor.
O que eu acho timo. Adore-se quando voc tiver um segundo.
Oh, certo, disse a cabra. Sua sobrinha. A sobrinha que voc matou. Eu estou com voc agora.
Por alguns momentos, eles ficaram se entreolhando. Tempo bastante para que ambos o Dr. Cham e a cabra pensassem:
Oh, sim. Hannah nos causa muitos aborrecimentos. Ela j est falando sobre rosquinhas de bordo.
Ela sempre comea falando sobre rosquinhas de bordo assim na lata? perguntou a cabra.
Sim, ela faz isso, disse o Doutor. Ela traz isso para voc, depois ela traz para mim. Ela v uma rosquinha de bordo
em algum lugar Eu no me lembro muito bem onde.
Eu estou vendo uma rosquinha de bordo de verdade? Hannah disse. Eu preciso de uma de verdade.
Ok, ok, disse a cabra. Sim, eu lembro: agora a parte que ela diz que se ela conseguir uma rosquinha de bordo de
verdade, ela ser uma pessoa real novamente. Porque o real destino dela era ter uma padaria e voc arruinou isso e
agora ela est condenada a ser um fantasma.
Hey, isso verdade! Hannah uivou.
terrvel que tenhamos que fazer essa cena inteira de novo, disse o Doutor. As rosquinhas no so materiais. Elas
devem ser todas deixadas de fora.
Cara, estou tendo problemas para lembrar tudo desse captulo, disse a cabra. Eu nem me lembro como sair desse
corredor. Eu devo ter lido aquele livro tipo trinta vezes. Ns entramos destruindo uma parede? Ns gritamos at que
algum nos ache?
Ns fizemos a Hannah flutuar pelas paredes e ela encontra algum tipo de mquina, disse o Dr. Cham. Eu tenho que
escrever um programa e tudo d certo de algum modo.
Mas, voc sabe o que eu estou dizendo? disse a cabra. Eu esqueo todos os detalhes. Especialmente dos captulos
anteriores. Quer dizer, eu lembro do final perfeitamente. complicado ficar sentando vendo tudo isso. O final to
melhor.
Dr. Cham flexionou seus braos balanou seu calcanhar. O porco-espinho. Sorriu ambiciosamente para a cabra.
Oh, com certeza. O porco-espinho definitivamente quem eu quero conhecer, disse a cabra. Eu me pergunto o qu
ele far com todo aquele dinheiro depois que o livro terminar.
Dr. Cham acenou respeitosamente. Estou doido para ver ele de chinelos.
Aqueles chinelos infernais! disse a cabra e gaguejou grosseiramente, um banho de saliva jorrando de suas
mandbulas.
A mente de Hannah estava chacoalhando, perturbada, esperando que essas tolices cessassem por um momento. Ela
inclinou sua cabea de lado e o chocalho deslizou junto da curva de seu crnio. De qualquer modo, o barulhinho
sumiu, a medida que a parte de trs de sua cabea desaparecia (vazava como ela chamava isso). Ento a sua cabea
estava novamente com seu pequenino chocalho e ela se encontrou fazendo mais uma vez aquele indiscreto gemido.
HRRRRRR-RRR-OH-RRRR-RRRR.
Eu no estou nessa de bacon pedaudo disse a cabra. No vejo o qu to legal nisso.
Podia ela falar gemendo? BON-BON. Com um sotaque francs. BOHN-BOHN. BOHN-APPE-TEET-OHHHH-
RRRR.
Eu sei que ela inofensiva, mas esse som me d calafrios. Meu cabelo est completamente em p.
Hannah? disse o Dr. Cham. Onde voc est, criana? Venha e volte para ns, minha sobrinha.
Ela estava bem perto deles, dentro e fora. E eles podiam ouvi-la
limpando a voz, clara, falando como um anjo esparramando
poeira estelar. Sim, toda a estria da rosquinha de bordo veio de
novo, e mais sobre a padaria que ela seria dona, os muffins,
pezinhos e baguetes.
INTERVALO_NUMERICO = 1..25
end
Esta classe contm duas definies: o mtodo de definio (def) e um de definio de atributos (attr_reader).
Ambos so, realmente, apenas mtodos de definio.
O attr_reader um atalho idntico escrever o este cdigo Ruby:
class BilheteLoteria
def numeros_escolhidos; @numeros_escolhidos; end
def data_compra; @data_compra; end
end
Executando o cdigo acima, eu apenas pego: [23, 14, 20]. Voc receber um erro se acontecer dos dois nmeros
aleatrios serem idnticos.
Entretanto, eu no posso mudar os nmeros escolhidos no bilhete de loteria de fora da classe.
bilhete.numeros_escolhidos = [2, 6, 19]
Oh, no. Mas ns temos um estpido erro que aparece quando dois dos nmeros aleatrios so idnticos. Se dois
nmeros so iguais, o initialize lana um ArgumentError.
O truque voltar e reiniciar o mtodo se um erro acontecer. Ns podemos usar o rescue (resgate) do Ruby para
apanhar o erro e redo (refazer) o mtodo do incio.
class BilheteLoteria
def self.novo_aleatorio
new( rand( 25 ) + 1, rand( 25 ) + 1, rand( 25 ) + 1 )
rescue ArgumentError
redo
end
end
Melhor. Pode demorar algumas vezes para que os nmeros caiam juntos corretamente, mas cairo.
A espera far o suspense, no?
O capito loteria mantinha um registro de todos que compraram bilhetes, junto com os nmeros
de loteria deles.
class SorteioLoteria
@@bilhetes = {}
def SorteioLoteria.compra( cliente, *bilhetes )
unless @@bilhetes.has_key?( cliente )
@@bilhetes[cliente] = []
end
@@bilhetes[cliente] += bilhetes
end
end
Quando chega a hora do sorteio da loteria, o pai do Paij-ree (o capito loteria) adiciona um bit de cdigo para
selecionar aleatoriamente os nmeros.
class BilheteLoteria
def pontuacao( final )
contador = 0
final.numeros_escolhidos.each do |nota|
contador += 1 if numeros_escolhidos.include? nota
end
contador
end
end
O mtodo pontuacao compara um BilheteLoteria com um bilhete aleatrio, o qual representa a combinao
vencedora. O bilhete aleatrio passado atravs da varivel final. O bilhete recupera um ponto para todo nmero
vencedor. A pontuao final retornada pelo mtodo pontuacao.
irb> bilhete = BilheteLoteria.new( 2, 5, 19 )
irb> vencedor = BilheteLoteria.new( 4, 5, 19 )
irb> bilhete.pontuacao( vencedor )
=> 2
Com o tempo voc ver o quo brilhante Paij-ree. Seu pai o encarregou de conduzir a loteria por ele, medida que a
demanda por bilhetes consumia todas as horas do dia do capito da loteria. Voc consegue imaginar o jovem Paij-ree
em seu terno pomposo brincando com elsticos com seus dedos jovens, em meio reunio da empresa na qual
props a pea final do sistema? Com certeza, quando se levantou, seu pai falou tudo para ele, mas foi ele quem ligou o
projetor e fez todos os gestos com as mos.
class << SorteioLoteria
def jogo
final = BilheteLoteria.novo_aleatorio
vencedores = {}
@@bilhetes.each do |comprador, lista_bilhetes|
lista_bilhetes.each do |bilhete|
pontuacao = bilhete.pontuacao( final )
next if pontuacao.zero?
vencedores[comprador] ||= []
vencedores[comprador] << [ bilhete, pontuacao ]
end
end
@@bilhetes.clear
vencedores
end
end
Os scios de seu pai ficaram atordoados. O que era aquilo? (Paij-ree sabia que era apenas a definio de um mtodo
de classe eles se sentiram completamente desmoralizados quando ele disse isso). Eles no conseguiam entender as
duas setas para esquerda. Sim, era um concatenador, mas o que estaria ele fazendo em meio definio da classe?
Bebs, pensava Paij-ree, embora mantivesse bem alta a auto-estima de cada um destes homens. Ele era apenas uma
criana e crianas so duras como uma parede de tijolos.
O operador << permite a voc alterar a definio de um objeto. Paij-ree simplesmente havia usado a classe
SorteioLoteria, e o mtodo dele, jogo, seria um mtodo de instncia normal. Mas, uma vez que usou o
operador <<, o mtodo jogo ser adicionado diretamente classe, como um mtodo de classe.
Quando voc viu class << obj, acredite em seu corao, eu estou adicionando diretamente para a definio de
obj.
O embrio do instrutor de rgo tambm lanou um truque na sintaxe digno de ser examinado. Na nona linha, um
vencedor foi encontrado.
vencedores[comprador] ||= []
vencedores[comprador] << [ bilhete, pontuacao ]
Mas estes dias de inocncia no continuaram para Paij-ree e seu pai. Seu pai, frequentemente, se esquecia de lavar seu
uniforme e acabou contraindo uma micose em seus ombros. A doena afetou gradualmente seu equilbrio e seu senso
de direo.
Seu pai ainda tentou futilmente manter os negcios funcionando. Ele rodou a cidade, algumas vezes andando, de
forma deplorvel, passo-a-passo sobre os paraleleppedos, muitas vezes tateando as paredes, contando os tijolos at o
salo dos matemticos e a estao dos cocheiros, onde ele teria empurrado bilhetes de loteria aos transeuntes, que o
cercaram e o esbofetearam com grandes beterrabas molhadas. Mais tarde, Paij-ree iria encontr-lo em uma esquina,
seu sangue escorrendo nos esgotos da cidade junto aos sucos das escuras, respingantes beterrabas, cujo suco
preencheu o caminho at suas veias e coagulou firmemente como um amontoado exrcito de brake lights lutando por
um lugar nos pedgios.
Uma Palavra Sobre Accessors (Porque Eu Te Amo e Espero Por Seu Sucesso e Meus Cabelos
Esto Raleando Com Isto e Os Sonhos Realmente Se Tornem Realidade)
Anteriormente, eu mencionei que attr_reader adiciona um mtodo reader, mas no um mtodo writer.
irb> bilhete = BilheteLoteria.new
irb> bilhete.numeros_escolhidos = 3
NoMethodError: undefined method `numeros_escolhidos=' for
#<BilheteLoteria:0xb7d49110>
Que est correto neste caso, visto que o pai do Paij-ree no queria que os nmeros fossem alterados depois que o
bilhete fosse vendido. Se estivssemos interessados em ter variveis de instncias que teriam ambos os mtodos
reader e writer, deveramos usar attr_accessor.
class BilheteLoteria
attr_accessor :numeros_escolhidos, :data_compra
end
Santos gatos! Olhe para estes mtodos escritores por um momento. Ele so chamados mtodos picks= e
purchased=. Estes mtodos interceptam atribuies externas variveis de instncia. Constantemente voc ir
deixar attr_reader ou attr_accessor (ou mesmo talvez attr_writer) fazer o trabalho por voc. Outras
vezes, voc mesmo ir querer tomar conta da portaria, checando as variveis mais detalhadamente.
class CompeticaoSkate
def o_vencedor; @o_vencedor; end
def o_vencedor=( nome )
unless nome.respond_to? :to_str
raise ArgumentError, "O nome do vencedor deve ser uma String,
no um problema matemtico ou uma lista de nomes ou qualquer outra
coisa parecida."
end
@o_vencedor = nome
end
end
Na maior parte das vezes voc no vai querer usar isto. Mas, assim que formos caminhando atravs das lies, voc
ir perceber que Ruby possui muitas escotilhas e vielas nas quais voc pode se enfiar e hackear cdigo. Tambm estou
lhe preparando para metaprogramao, que, se puder farejar o drago, est ameaadoramente prxima.
Paij-ree era um jovem e audaz Endertromaltoek. Ele martelava ossos
de animais em longos, deslumbrantes trompetes com orifcios Outro Trecho de Os
profundos que eram conectados por cortias que os msicos uniam a
seus dedos. Obviamente ele vendeu apenas trs destas unidades, mas Comedores de Cachecis
ele estava amplamente injuriado pois um acadmico autnomo, um (do Captulo VIII: Na Altura do Cu.)
tipo demnico, para ele era de uma classe mais pobre e os pobres s
conseguiam seu brilhantismo atravs de prticas satnicas. Claro, Eu conheo voc, disse Brent. E conheo
estavam certos, de fato, ele tinha um acordo com os magos negros, seus cronogramas. Voc no poderia ter feito
com quem ele mantinha encontros anuais, sofrendo atormentadoras esse arquivo Flash.
primaveras ardentes, banhando-se enquanto eles lanavam feitios. Ento, voc est dizendo que sou previsvel?
Ele adorava seu pai, mesmo sabendo que seu pai deteriorara em nada disse Deborah. Ela abriu suas mos e os
mais que um giroscpio. Ele idolatrava o trabalho do homem e palitos de batatas cambalearam, como
gastava seus pequenos ganhos jogando na loteria. Ele adorava pequenas lontras do mar felizes e bbadas,
assistir os numerais, cada um pintado sobre bolas de argila ocas, para dentro da panela eltrica aberta.
levantadas do robloch (que qualquer tipo de fluido, reservatrio ou Voc muito linear, disse Brent. Ele pegou
entorno que vem resiste a presena de fantasmas), os grandes uma lapiseira, segurou-a bem diante de seus
banqueiros amarrando-as num cordo de prata, lendo-as em ordem. olhos, encarando-a firmemente antes de
Mesmo hoje. Paij-ree pinta as cenas com pinceladas cruas de tinta devolv-la ao estojo no balco. Voc sabe
preta em folhas de papel alumnio. bastante tocante ver o que ele pelo menos como carregar uma cena? Como
recuperou na preciosidade de sua memria, mas no sei dizer pular quadros? Este filme que vi estava em
exatamente porque ele o faz em folhas de papel alumnio. Seus todo lugar, Deb.
desenhos rasgam com bastante facilidade. O prprio Paij-ree fica Ela empilhou cinco cachecis tricotados e uma
confuso e lhe servir bolo de po usando esta arte, mesmo aps ela nica bandana na panela eltrica e ajustou para
ter sido corretamente emoldurada. Ento, so tantas coisas sobre ele a temperatura mxima. Ela fechou a tampa,
que so problemticas e absurdas e absolutamente miserveis. deixando sua mo repousar sobre esta.
A doena espalhou-se sobre a forma de seu pai e ervas pantanosas Sobre o qu este filme? Indagou Deborah.
cobriam as mos e a face de seu pai. O musgo empurrava sua "Voc visita sites em Flash todo o tempo. Voc
espinha para uma rgida verticalidade. To espesso era o turmo sobre jogou o jogo do Gnomo Bola de Neve por dois
sua cabea que ele aparentava vestir um arbusto num chapu de segundos, ele no lhe interessou. Voc nem
lanador. Ele tambm chamava a si mesmo por um novo nome mesmo ligou para os jogos de Boliche do
Quos e ele curava as pessoas em que tocava, deixando uma pilha Gnomo. E voc tambm no ficou intimidado
de vilas cheias de vida no seu caminho a medida que viajava pelas por aquele jogo em flash Acerte o Pingim.
cidades. Muitos o chamavam de Musgossias e choravam sob seus Elfo versus Pingim? Nem pergunte!
ps, o que molhava os brotos e o levava a germinar no solo. Isto o
deixava momentaneamente irritado, ele duramente chacoalhava suas Agora vem este filme e voc no pode ir com
pernas para libertar-se e selvagemente levava suas mos ao cu, calma. Ela se aproximou e insinuou-se perto
trazendo um trovo de fragmentos de luz sobre estes patticos dele. Ei, mano, sou eu. Deborah. O que
aconteceu quando voc viu aquele filme?
Paij-ree estava distante das odissias espirituais de seu pai (de fato,
pensou o homem morto), ento ele apenas viu a decadncia da Tudo, disse Brent, seus olhos refletindo um
loteria sem a presena de seu capito. neste ponto em que Paij-ree milho de mundos. E: nada. Ele comeou
foi ao trabalho, revivendo a falecida loteria de sua famlia. com uma jovem garota montando num javali
selvagem. Ela tocava gaita. A msica da gaita
flua com desconforto, insegura. Mas ela
montava naturalmente, como se montar um
javali selvagem no fosse grande coisa. E com
Jogando com Poucos Dedos Flash, montar um javali selvagem realmente
no grande coisa.
A cidade estava repleta de pessoas que perderam o interessa na
loteria. O tempo tinha realmente exaurido a todos. Aquela terrvel Deborah soltou sua pulseira e a colocou no
chuva alagando seus pores. Toda a cidade foi forada a mover uma balco prximo a panela eltrica.
estria adiante. Voc colocaria a tampa de volta em sua caneta e A borda do filme comeou a desmanchar-se,
ento arruinaria a caneta, visto que a tampa j estava repleta de lama. uma poa de tinta se formou. O javali
Todos estavam esgotados, muitas pessoas afogadas. levantou-se, mas suas pernas deram lugar para
Paij-ree gastava seus dias numa quadriliche, o nico mvel que a toda negra, tinta pulverizada.
permanecia acima do nvel dor mar. Ele dormia na cama de cima. A Nuvens negras se encontraram. Msica
terceira cama tambm estava seca, ento ele deixava uma gaivota hardcore comeou a tocar. Agentes secretos
desabrigada de sua cratera fazer seu ninho sobre a cama. A gaivota vieram das nuvens. Caras da CIA e coisas
no precisava de toda a cama, ento Paij-ree tambm mantinha seus assim. A animao simplesmente detonova.
lpis e calculadores nela.
E ento, no finalzinho do filme, estas
De incio, estes foram tempos muito sombrios para ambos, e eles palavras esmaecem na tela. Em letras brancas,
persistiram em continuar com m aparncia o tempo todo. Paij-ree negrito.
tornou-se obcecado por suas unhas, mantendo-as longas e intocadas,
enquanto o resto dele deteriorava sob uma vasta cabeleira. Na Na altura do cu, disse Deborah.
companhia de Paij-ree, a gaivota da cratera aprendeu sua prpria Como voc sabia? tremeram os lbios de
excentricidade e arrancava todas suas penas do lado direito de seu Brent. Poderia ela ser confivel?
corpo. Ela se parecia com um diagrama em corte.
No h mais espao no mundo, ela disse.
Eles aprenderam a ter pocas felizes. Paij-ree entalhou uma flauta a No h espao para comedores de cachecis,
partir da parede usando suas unhas e a tocava frequentemente. Na no h espao para voc e eu. Aqui, segure
maioria das vezes ele tocava suas canes relaxantes durante o dia. minha mo.
tarde, eles batiam na parede e chacoalhavam a estrutura da cama
em ritmo com sua msica. A gaivota ficou doida quando ele tocou
quatro notas determinadas repetidamente. Ele assistia a gaivota em
xtase voando em crculos. Paij-ree mal podia manter sua
compostura dado o efeito que tinha aquela pequena melodia. Ele no
se agentava, babando de tanto rir.
Paij-ree chamava a gaivota de Eb-F-F-A (Mi-bemol-F-F-L),
depois desta msica favorita.
A amizade pode ser um excelente catalisador para o progresso. Um
amigo pode encontrar em voc caractersticas que nenhuma outra
pessoa consegue ver. como se ele procurasse sua pessoa e de
algum jeito encontrasse cinco jogos completos de talheres de prata
que voc nunca soube que estiveram l. E mesmo que este amigo
no entenda porque voc tem estes talheres escondidos, , ainda
assim, um grande feito, digno de respeito.
Enquanto Eb-F-F-A no encontrava a prataria, ele havia encontrado uma outra coisa. Uma pilha de uma outra coisa.
Visto que Paij-ree estava abandonado sobre a cama qudrupla, a gaivota faria uma explorao em busca de alimento.
Um dia ela voou at um barril, flutuando sobre onde ficava o galpo de ferramentas. Eb-F-F-A andou sobre o barril,
rolando-o at a casa de Paij-ree e ento o quebrou, revelando a coleo perdida de bicos de pato.
Sim, bicos de pato de verdade. (Eb-F-F-A estava esofagizando seus grasnos. mantendo-se calmo, sugando as gotas de
suor de volta para sua testa patos no eram da mesma pena que ele, mas mesmo assim da mesma famlia.) Paij-ree
aplaudiu com alegria, absolutamente, ele pretendia cobrir sua casa com estes bicos, eles poderiam ter contido um
pouco da torrente. Provavelmente no muita coisa, nenhum motivo para reclamaes.
E a cola do teto estava ao p do barril e eles eram dois companheiros de beliche empreendedores com tempo livre,
ento eles fizeram uma balsa com os anteriormente quacveis lbios. E para fora foram eles, para o interior!
Movendo-se atravs de uma total mistura de cidade e sopa. Quo estranho era atingir uma praia e ento descobrir que
era apenas a velha e suja estrada que passava pelo trevo de Toffletown.
No interior, eles vendiam. Era sempre uma longa caminhada at a prxima plantao, mas existiam alguns poucos
compradores na manso (Bem-vindo a Manso Erguida com Besouros, diziam eles ou, A Manso Erguida com
Substitutos do Celofane voc no sabe quo perigoso pode ser o celofane verdadeiro?) E uma das famlias
embrulhavam sobras de gelatina e presunto em algum celofane para os dois viajantes. E eles quase morreram no dia
seguinte por causa delas.
Ento, quando veio o calor e, como a primeira loteria do interior era noite, um fazendeiro chamou por eles do seu
terreno, enquanto ele estava prximo de uma vaca sua que pastava. Paij-ree e Eb-F-F-A foram at ele, murmurando
um ao outro se deveriam oferec-lo o Bilhete Especial Gasto pelo Vento ou se ele preferiria optar em ganhar o
Arriscado Medalho Original Caseiro Interiorano do Roco.
Mas o fazendeiro lhes acenou a medida que se aproximavam, No, deixem suas calculadoras e rodas de
probabilidades. para a minha papa-capim. Ele quis dizer sua vaca. A verso de Emdertromb: o dobro de carne, duas
vezes mais carnuda, no produz leite, produz chapas de papel. Ainda assim, ela pasta.
Sua papa-capim (poh-kon-ic) quer um bilhete da sorte? indagou Paij-ree.
Ela viu vocs e ficou realmente empolgada, disse o fazendeiro. Ela no sabe nmeros,
mas ela entende um pouco sobre sorte. Quase foi acertada por um avio senil um dia e,
quando a encontrei, ela apenas levantou os ombros, como se dissesse, Bem, acho que no
foi nada
Toda (shas-op) loteria numr-(iga-iga)-ica, afirmou Paij-ree. Ela sabe (elsh) notas musicais? Minha guia sabe
(losh) notas musicais., disse Paij-ree. "Paij-ree assobiou para a gaivota da cratera e ela respondeu com um D (D)
contnuo.
O fazendeiro no podia falar com a conscincia musical de sua papa-capim, ento Paij-ree enviou a gaivota para
descobrir (D-D-D-A-D (R-R-R-L-R), v-ensinar-a-vaca) enquanto ele hackeava algumas melodias em sua
calculadora.
class BilheteLoteriaAnimal
end
No h necessidade de os bilhetes para animais se comportarem drasticamente diferente dos bilhetes tradicionais. A
classe BilheteLoteriaAnimal internamente diferente, mas expe os mesmos mtodos vistos na classe
BilheteLoteria. O mtodo escore at mesmo idntico ao mtodo @score da antiga classe
BilheteLoteria.
Ao invs de usar uma varivel de classe para armazenar a lista de notas musicais, elas so armazenadas numa
constante chamada BilheteLoteriaAnimal::NOTAS. Variveis mudam e a lista de notas no deveria.
Constantes foram projetadas para se manterem. Mesmo assim voc pode alterar a constante, mas ter que trapacear ou
o Ruby ir chiar.
irb> BilheteLoteriaAnimal::NOTAS = [:ASSOBIO, :GORJEIO, :BALIDO]
(irb):3: warning: already initialized constant NOTAS
=> [:ASSOBIO, :GORJEIO, :BALIDO]
A gaivota voltou com a papa-capim, o nome dela era Merphy, ela estava empolgada em tentar a sorte, ela inflou seu
rosto sonhador, assobiou cinco ou seis notas em srie, todas elas seguraram seu colar, puxaram-na para perto da
calculadora e a deixaram respirar trs notas, ento eles estrangularam o ltimo ar at que seu bilhete estivesse
impresso e tudo estava catalogado certinho dentro de @@@bilhetes[merphy]@. Obrigado, vejo voc no sorteio!
Ento a febre da loteria tornou-se uma epidemia entre as simples mentes dos animais. Paij-ree poupou algum custo,
usou a mesma classe SorteioLoteria que ele usaria no ambiente comum da loteria de sua infncia. E logo os
animais estavam fazendo sua prpria msica, seus prprios mapas e filmes.
E Os Originais? Perguntei a Paij-ree. Eles devem ter odiado seus animais!
Ele porm recuou com mau humor e franziu sua testa. Eu sou um Original. Assim como voc. Ns odiamos (ae-o)
algum deles?
No muito tempo aps o trmino da loteria, Paij-ree sentiu a gaivota da cratera Eb-F-F-A descendo em seu ombro, ela
ento assobiou um urgente e triste C-Eb-D-C-A-Eb (D-Mi Bemol-R-L-Mi Bemol). Estas notas desesperadas
enviaram uma onda de calafrios atravs do corpo de Paij-ree. Tinha o Deus Rei de Bbado Solo. Nosso Amado
Topirio, o Musgossias Quos, Pai Literal Daquele Homem Quem Era O Instrutor de rgo da Minha Filha tinha
ele realmente chegado ao seu fim? Como isto poderia acontecer? Poderiam as grandes rvores no mais nutri-lo e
guiar os ventos midos em sua direo? Ou seu prprio esguio lquen cobriram seu caminho e cresceram obstruindo
sua respirao?
Voc no liga dizia a cano da gaivota. Ele deteriorou-se e enfraqueceu e caiu na porta iluminada de seu casebre.
Seus rebentos torcendo e chorando para que o dia no acabasse. Para que o sol permanecesse fixo e longe e
atencioso.
Plor-ian, o criado da casa, deixou que os jarros viessem e Quos manteve-se bem hidratado at que Paij-ree chegou
para avaliar os cados botes de plantas macias e o emergente rosto de seu pai, o capito da loteria. Sua pele
profundamente marcada como um travesseiro cheio de bordados; Grandes galhos saltavam-lhe dos braos agora
retrados com grande sede.
Paij-ree penteou as longas razes que rodeavam os olhos de seu pai e aquelas que vinham do canto de sua boca.
Enquanto eu gostaria de lhe dizer que as lgrimas de Paij-ree rolavam at os braos e poros de seu pai, rejuvenescendo
e recuperando o gramado cavalheiro: No posso dizer isto.
Na verdade, as lgrimas de Paij-ree rolavam at seus braos e caiam no cho de tbuas rangentes, alimentando as
desprezveis ervas daninhas, energizando a matria negra das plantas, que literalmente saltavam atravs do cho
noite e sufocavam Nosso Quos. Puxo, rasgo, crack. E este era seu esqueleto.
Depois disso Paij-ree nunca mais poderia ser chamado de Wert-ree ou Wer-plo.
Os ltimos vivos entre Os Originais, disse Dr. Cham. Voc est certa disso, Hannah? O que, de qualquer modo,
ela no escutou, a medida que seus olhos repousavam fixamente nas lendrias criaturas.
Olhe para eles, falou a cabra. Estes caras escreveram o livro das regras, Doutor. Ns devemos tudo a estes caras.
E Deus? disse Dr. Cham.
Eu realmente no sei, disse a cabra. Hannah provavelmente sabe melhor sobre isto do que qualquer um de ns.
Hannah nada disse. Ela apenas conhecia um outro fantasma e este era seu Mediador Ps-Falecimento, Jamie Huft.
Quem parecia no ter qualquer resposta para ela e exigia que as questes fossem enviadas em escrito com um selo
auto-enderevel incluso no envelope. Hannah no tinha ainda visto a bola rolar naquela caixa postal.
Devemos estar no alto das montanhas, afirmou a cabra. Vejam s essa escurido.
Eu vi um outro convs como este l embaixo onde encontramos Hannah, disse Dr. Cham. L embaixo, perto da sua
rea de moradia. Voc deveria gastar algum tempo para procur-lo. L bastante pacfico. Voc pode ver a Terra e os
sete mares.
Os sete mares? A cabra imaginou se isso era prximo ao grupo as Rockettes. Ela leria sua parte no material sobre
dana de preciso e veria aquela linha de pernas, caminhado a paos midos sobre o palco como um grande, e brilhoso
preparador de solo.
Hannah movimentou-se com vida.
E nenhum dos trs falou quando Os Originais desligaram o projetor de slides e embarcaram num foguete bastante fino
que passou fulminante com clareza atravs de uma rachadura no teto do compartimento de cargas.
Minha nossa, disse a cabra.
O qu? perguntou Hannah.
Voc vai morrer, falou a cabra.
Dr. Cham olhou para os controles a frente deles, um longo painel de alavancas acolchoadas e telas verdes.
Eu j estou morta. Sou um fantasma.
A cabra encarou o Doutor, que estava explorando o painel de controle. Ok, bem, se o seu tio no tiver uma
conversinha com voc, eu vou deixar as coisas bastante claras. Existe uma grande chance de que estes caras vo
construir uma bomba. E voc v como estou inquieto? Voc v como meus joelhos esto tremendo?
Ahan.
Ahan, o quo real isto aqui, garota. Eu no me lembro de nada do livro maldito exceto que estes caras esto
construindo uma bomba que pode explodir o mundo fantasma. E, uma vez que o mundo fantasma se for, ento o
Escavador Dosh ter seu segundo retorno. um negcio que eles calcularam. Inferno, algo doentio, isto tudo que
voc precisa saber.
Mas estou morta.
Ok, bem, ns estamos conversando, no estamos? Voc pode falar, ento voc est morta? A cabra chacoalhou a
cabea. Eu gostaria de me lembrar se ns vencemos ou se foi mesmo o Dustin Hoffman.
Hannah berrou. "Por que eu tenho que morrer de novo? Ela choramingou, suas pernas estremeceram em descontrole e
ela caiu no cho. MOH-MOHHH-MAO-MAOOO.
Dr. Cham tinha puxado com muita fora uma alavanca felpuda, o que destravou e fez deslizar, como um porta po, a
tampa de um compartimento. Ele colocou suas mos l dentro e encontrou um teclado firmemente preso.
" isso," disse ele e colocou irb, que apareceu numa tela a esquerda de seu oculto teclado. Ele checou a verso do
Ruby.
irb> RUBY_VERSION
=> "1.8.6"
O Ruby estava atualizado. O que mais ele podia fazer? Escanear constantes e class_variables era intil. A
nica razo de ter funcionado com a classe Elevador era porque algum tinha deixado o irb rodando com suas
classes ainda carregadas.
Ele tinha acabado de carregar este irb e nenhuma classe especial estava disponvel. Ele tinha que encontrar algumas
classes. Ele comeou carregando o arquivo `rbconfig` para ter uma idia de quais eram as configuraes do Ruby.
irb> require 'rbconfig'
=> true
irb> Config::CONFIG
=> {"abs_srcdir"=>"$(ac_abs_srcdir)", "sitedir"=>"bay://Ruby/lib/site_ruby", ... }
L havia muita informao para se analisar. A constante Config::CONFIG um Hash que contm cada
configurao do ambiente usada para ajustar o Ruby. Voc pode encontrar o nome do sistema operacional em
Config::CONFIG['host_os']. O diretrio onde as bibliotecas principais do Ruby so armazenadas pode ser
encontrado em Config::CONFIG['rubylibdir']. Os programas Ruby podem armazenar arquivos auxiliares
em Config::CONFIG['datadir'].
De qualquer maneira, O que Dr. Cham realmente precisava era uma lista de todas as bibliotecas que no eram
bibliotecas principais do Ruby. Bibliotecas que foram instaladas pelos Originais ou quem quer que tenha manejado
este console. Ele checou algumas variveis globais por esta informao.
irb> $"
=> ["irb.rb", "e2mmap.rb", "irb/init.rb", ... "rbconfig.rb"]
irb> $:
=> ["bay://Ruby/lib/site_ruby/1.9", "bay://Ruby/lib/site_ruby/1.9/i686-unknown",
"bay://Ruby/lib/site_ruby", "compartimento://Ruby/lib/1.9",
"bay://Ruby/lib/1.9/i686-unknown", "."]
Aha, timo. Dr. Cham coou sua barba e olhou para sua sesso o irb. A varivel global $" contm um Array de cada
biblioteca que foi carregada com require. A maioria destas bibliotecas foram carregadas pelo irb. Embora ele
havia carregado 'rbconfig.rb' a pouco.
A varivel global $:, que pode tambm ser acessada como $LOAD_PATH, contm uma lista com todos os diretrios
em que Ruby ir checar quando voc tentar carregar um arquivo com require. Quando Dr. Cham rodou require
'rbconfig', Ruby verificou nesta ordem cada um dos diretrios.
bay://Ruby/lib/site_ruby/1.9/rbconfig.rb
bay://Ruby/lib/site_ruby/1.9/i686-unknown/rbconfig.rb (*)
bay://Ruby/lib/site_ruby/rbconfig.rb
bay://Ruby/lib/1.9/rbconfig.rb
bay://Ruby/lib/1.9/i686-unknown/rbconfig.rb
./rbconfig.rb
O segundo caminho era onde o Ruby acabaria por encontrar o arquivo rbconfig.rb. Dr. Cham sups que os primeiros
cinco caminhos eram caminhos absolutos. Estes eram caminhos para diretrios num disco chamado
compartimento. Caminhos absolutos podem variar em seu sistema. No Windows, caminhos absolutos comeam
com a letra do disco. No Linux, caminhos absolutos comeam com uma barra.
O diretrio "." indicava um caminho absoluto; O ponto solitrio representa o diretrio de trabalho atual. O diretrio
onde Dr. Cham inicializou o irb. Ento, depois de Ruby ter procurado em todos locais padro, ele checou o diretrio
atual.
A cabra deu uma espiada com sua cabea ao redor de Dr. Cham e assistia todas estas instrues exalarem, a medida
que ele lambia seus lbios para manter suas salivaes longe dos monitores e dos brilhosos botes. Ele havia soltado
alguns regozijos (nas linhas de: No, isso no ou Sim, sim, isso mesmo ou Ok, bem, voc escolhe), mas agora ele
estava completamente envolto, recomendando cdigo, Tente require 'setup' ou, no, tente 3 * 5. Tenha
certeza que a matemtica bsica funciona.
Claro que a matemtica funciona, disse Dr. Cham. Deixe comigo, eu preciso encontrar algumas classes teis.
um simples teste de sanidade, disse a cabra. Apenas tente. Faa 3 * 5 e veja o que aparece.
Dr. Cham cedeu.
irb> 3 * 5
=> 15
Ok, muito bom! Estamos dentro! a cabra chacoalhou alegremente sua cara peluda.
Dr. Cham deu um tapinha na cabea, timo. Agora podemos continuar.
irb> Dir.chdir( "bay://Ruby/lib/site_ruby/1.9/" )
=> 0
irb> Dir["./*.{rb}"]
=> ['endertromb.rb', 'leitormental.rb', 'fazedorpedidos.rb']
Dr. Cham tinha usado chdir para mudar o diretrio atual de trabalho para o primeiro caminho listado no
LOAD_PATH. Este primeiro caminho em site_ruby um lugar comum para armazenar classes personalizadas.
Aqui estavam as trs classes lendrias que o instrutor de rgo da minha filha havia anotado para mim anteriormente
neste captulo. E, Dr. Cham, tendo lido o dito captulo, reconheceu estas trs peas do sistema imediatamente.
A classe Endertromb. que continha os mistrios dos poderes deste planeta. A classe LeitorMental que,
escaneando as mentes de seus habitantes, lia o contedo de cada mente. E, finalmente, a classe crucial
FazedorPedidos que permitia a realizao de desejos de dez letras, caso o desejo alguma vez encontrasse um
caminho para o ncleo de Endertromb.
O que voc acha de 4 * 56 + 9? perguntou a cabra. No sabemos se isso pode fazer expresses compostas.
Eu tenho o LeitorMental bem aqui, disse Dr. Cham. E eu tenho o FazedorPedidos bem aqui do lado dele.
Este planeta pode ler mentes. E este planeta pode fazer pedidos. Agora, vamos ver se ele pode fazer ambos ao mesmo
tempo.
Qual seu plano? perguntou a cabra. Parece que eu poderia resolver este problema em umas trs linhas.
Este Mdulo a nova tecnologia de EscanerPedidos, disse ele. O escner s pega um desejo se ele comea
com a palavra pedido, um dois pontos e um espao. Deste modo o planeta no ser preenchido com cada palavra
com menos-de-dez-letras que aparecem na cabea das pessoas.
`Por que voc simplesmente no usa uma classe? indagou a cabra.
Porque um Mdulo mais simples que uma classe. apenas um aparato de armazenamento para mtodos. Ele
mantm um grupo de mdulos juntos. Voc no pode criar novos objetos a partir de um mtodo.
Mas voc no vai querer um objeto EscanerPedidos, para que voc possa realmente us-lo? disse a cabra,
chocada.
Eu vou mescl-lo com o LeitorMental, disse Dr. Cham. E assim o fez.
require 'leitormental'
class LeitorMental
include EscanerPedidos
end
Agora, o mdulo EscanerPedidos est mesclado ao LeitorMental, disse Dr. Cham. Posso chamar o
mtodo escanear_por_um_pedido em qualquer objeto LeitorMental.
Ento, um mixin, disse a cabra. O mixin LeitorMental.
Sim, qualquer mdulo que incluso numa classe com um include um mixin para esta classe. Se voc voltar e
olhar para o mtodo escanear_por_um_pedido, ver que ele chama um mtodo self.read. Eu apenas tenho
que ter certeza de que, qualquer que seja a classe com que estou mesclando o LeitorMental, ela tenha um mtodo
read. Caso contrrio, ocorrer um erro.
Isto parece bastante estranho, o fato do mixin precisar de certos mtodos que ele j no tem. Parece que ele deveria
funcionar por ele mesmo.
Dr. Cham moveu seus olhos do teclado para a cabra. Bem, como sua coleo de vdeos. Nenhuma das suas fitas de
vdeo funciona ao menos que voc as ponha numa mquina que use fitas de vdeo. Eles dependem um do outro. Um
mixin tem alguns requisitos bsicos, mas uma vez que uma classe atinge estes requisitos, voc pode adicionar toda
esta funcionalidade extra a ela.
Hey, isso legal, disse a cabra.
Voc leu o livro trinta vezes e no pegou isso? perguntou Dr. Cham.
Voc bem melhor professor pessoalmente, disse a cabra. Eu no pensei que fosse gostar tanto assim de voc.
Eu compreendo completamente, disse o Doutor. Isto muito mais real do que as tirinhas fazem s-lo.
require 'fazedorpedidos'
leitor = LeitorMental.new
pedidor = FazedorPedidos.new
loop do
pedido = leitor.escanear_por_um_pedido
if pedido
pedidor.realize(pedido)
end
end
Irb sentou e rodou o lao na tela. Ele far isso at que voc pressione Control-C. Mas Dr. Cham o deixou rodando.
Rodando o lao indefinidamente, escaneando as ondas mentais por um pedido adequado.
E Dr. Cham terminou seu pedido. No comeo, ele pensou imediatamente em um garanho. Para cavalgar em plo
sobre os vales de Sedna. Mas ele recuou com o pensamento, seu pedido no havia sido formado corretamente. Um
garanho era intil para perseguir Os Originais, ento ele fechou seus olhos novamente, mordeu seu lbio e pensou
com si mesmo: pedido: baleia.
Claro, levou um minuto para o bode cortar seu pedido para dez letras, mas ele logo estava a caminho, seguindo os
mesmos rastros no cu, at o Dr. Cham e sua sobrinha fantasma Hannah. At o grupo de animais vilanescos chamado
de Os Originais. At as Rockettes.
E o Escavador Dosh batia e festejava a cada segundo que eles deixavam para trs.
6.
Centro da Cidade
Concentrados em seus envolvimentos no plano de expanso de Os Originais, as raposas alta e a bem mais baixa
tinham viajado direto para a zona de alerta vermelho, a cidade de Wixl. Eu desejava uma esptula para coloc-las
juntas lado lado, arrast-las para a costa prximo as incubadoras da praia, escondendo-as nos montes de ovos de
peixes, puxando-as para baixo atravs de suas enormes orelhas, ocultando assim suas luxuosas peles. E acima delas eu
ficaria parado formando uma sombra imvel, mantendo-as na mira do meu rifle.
Eu no posso. Eu tenho voc para ensinar. Eu tenho que me arrumar e cuidar de mim. As lmpadas l de cima
precisam ser trocadas. Uma caixa de lmpadas halgenas simplesmente apareceram pelo correio. Algum l fora
obviamente est tentando me fazer us-las. Sendo assim eu vou instal-las o quanto antes. E depois ficarei l,
formando uma sombra imvel, segurando meu rifle.
Aquela sombra deveria ser legal e bem definida, sendo assim vou deix-la assim mesmo.
Eu gosto de
ver estes dois
em estado
selvagem.
Eles ficam
bastante
entendiados
aqui no
estdio.
Comearam
fazendo slogans estranhos e coisas assim. Eles tinham frases que insistiam em repetir, formando fixaes. Voc no
pode se expr a todas estas besteiras de raposa.
Vamos apenas dizer: Eu realmente estou tentando dar o meu melhor para manter as coisas num nvel acadmico.
Como nunca estive na faculdade, no posso dizer ao certo se cada passagem escrita est de acordo com o severo
critrio exigido academia.
Eu tenho vrios amigos universitrios, alguns que viajam o mundo em suas buscas, e eu tento inflexionar minha voz
com a mistura de alta cultura deles.
s vezes eu aplaudo a mim mesmo por ir alm do trabalho dos meus amigos educados apenas em corredores vazios,
ns nunca somos arrogantes em pblico porque na verdade eu me inscrevi em uma escola intelectual enquanto eles
ainda esto em seus livros, virando e virando.
Eu sou um pr-eventualista (para saber mais: http://preeventualist.org/). Eu tenho me interessado por isto por tempo
suficiente e me orgulho disto ter acontecido. Inevitavelmente, alguns de vocs j devem ter comeado a vasculhar este
livro atrs de simbologia Marxista. Sinto muito em matar estas interpretaes, mas acredito que qualquer concluso
niilista que voc possa ter, ser mantida sobre vigilncia.
De qualquer modo, vou deixar a retrica de lado. Eu apenas menciono o pr-eventualismo porque alm de ser uma
alternativa renovada e fcil ao ps-modernismo com que nascemos, isto oferece um servio de achados e perdidos
gratuito para os residentes de Wixl.
require open-uri
puts perdido.read
end
No tenho como alertar os raposos sobre este servio. E tenho certeza que ainda muito cedo para que seu caminho
seja listado. Ainda assim, as boas intenes esto aqui.
Se voc est conectado Internet, o cdigo Ruby acima deve ter baixado a pgina da Internet e impresso na tela uma
mensagem que se parece com isto: (Parece que a pgina em questo foi alterada, o resultado ser o contedo da pgina
atual.)
REGISTRO DE ACHADOS E PERDIDOS DOS "PR-EVENTUALISTAS"
(um servio gratuito para os ESCLARECIDOS que foram ILUMINADOS)
---
atualizaes so feitas diariamente, por favor, verifique!
---
...
todos os selos e privilgios so apresentados
sob a notvel autoria de Perry W. L. Von Frowling,
Magistrado Polywaif de Desapropriao. Tambm vencedor sete vezes
seguidas da respeitada Copa Comunitria do Mendigo Insistente
...
SOBRE O REGISTRO
==================
Ol, se voc novo, por favor fique conosco. A seguir, uma breve explicao sobre nossos
servios.
Em primeiro lugar, algumas notcias do nosso amado magistrado.
(As crianas o chamam de Tio Von Besteirotio. Haha!)
NOTCIAS IMPORTANTES
=======================
/ 15 de Abril de 2005 /
oi, grandes novidades. estivemos no canal 8 em wixl e ordish. o cory viu. eu e o jerry
mathers aparecemos.
se voc no viu, mande um e-mail pro cory. ele conta o melhor. tudo o que posso dizer que
aquilo no so os movimentos das MINHAS mos!! (piada para quem assiste o canal 8.)
obrigado harry e toda a equipe de notcias do canal 8!!
- perry
/ 7 de Abril de 2005 /
todos ns estamos lidando com o carpete aqui na central, mas se vocs puderem ficar de olho
na prancheta da caitlin, ela est muito sossegada para publicar, e eu sei que isto
realmente
importante para ela. Ela tinha algumas radiografias panormicas bem caras dos dentes tortos
de
seu marido, que estavam anexas algumas fotos insubstituveis do seu marido com traje de
robocop,
na poca em que seus dentes tortos eram mais visveis, ela disse (para mim), "Eles sabero o
que eu
quis dizer quando virem isto". eu no sei o que isso significa :(
/ 25 Fev 2005 /
servidor caiu s 3 horas. estou puto assim como vocs caras. o gaff t l embaixo e ele vai
ficar l
at consertar. :O -- ATUALIZAO: consertado, de volta na ativa!!
- perry
/ 23 de fevereiro de 2005 /
eu sei que tem muito barulho hoje. o circo stanley bros perdeu doze lhamas, um trailer, um
monte de
cadeados e cinco tendas. eles ainda esto procurando as coisas perdidas. por favor mantenham
suas
cabeas no lugar, eu preciso da ajuda de todos. esses comediantes no tm nada. eu falo
srio.
hoje eu dei um adesivo roxo para um cara ( s uma coisa que eu gosto de fazer como gesto
de solidariedade) e ele praticamente dormiu nele e nele cultivou os ingredientes para molho
de pizza.
eles esto no fundo do poo. ento doem por favor. eu sei que no temos paypal nem nada.
se voc quiser doar, divulgue que voc encontrou alguma coisa (uma bicicleta de criana, uma
compra do ms) e que isso tenha o nome do pessoal do circo escrito nele ou algo do gnero.
- timo, perry
- perry
Acho que o Youth Study Clan est fazendo um timo trabalho com esse servio. Est meio piegas e meio basico, mas
se conseguir fazer os animais pararem de usar seus meios mais instintivos de demarcar territrio, ento eu tiro meu
chapu.
Mesmo assim, um grupo de jovens pr-eventualistas? Como que pode? Voc tem que ter pelo menos flertado com
cinismo de verdade antes de poder se tornar um pr-eventualista. E definitivamente, no pode ir ao colgio. Portanto,
eu no sei.
Voltando lista de instrues do Registro de Achados e Perdidos Pr-eventualista.
USANDO O SERVIDOR A&P
=====================
No usamos HTML, para simplificar as coisa por aqui. Nosso pessoal j trabalha quinze
horas por dia. (Valeu, Terk!! Valeu, Horace!!)
Voc pode usar nosso servio para procurar coisas que voc perdeu. Ou pode adicionar
coisas que voc perdeu (ou achou) ao nosso registro. Isso feito digitando o endereo
correspondente no seu browser.
PESQUISANDO
===========
Para procurar coisas perdidas, use o seguinte endereo:
http://preeventualist.org/lost/search?q={palavra chave}
Voc pode substituir {palavra chave} pela sua pesquisa. Por exemplo, para pesquisar por
"xcara"
http://preeventualist.org/lost/search?q=xicara
Assim, voc receber uma lista das xcaras que foram achadas ou perdidas.
Se voc quer pesquisar somente por xcaras perdidas ou somente por xcaras achadas, use as
pginas 'searchlost' e 'searchfounds':
http://preeventualist.org/lost/searchlost?q=xicara
No estou de brincadeira. Eu sei onde est o caminho. Srio, no estou s provocando. Vou mostrar em um segundo.
S estou dizendo, olhe os raposos:
Elas esto
indefesas. E
mesmo assim,
aqui est essa
tima
ferramenta.
Possivelmente,
a chave para
sair dessa
confuso. S
quero dar uma fuada, ver se h alguma pista por aqui.
require 'open-uri'
No vejo nada sobre o caminho da raposa grande nessa lista. Tudo bem. Os raposos esto perdidos mesmo. Temos
algum tempo.
Voc aprendeu uma tcnica simples para recuperar uma pgina da Internet. O cdigo usa a biblioteca OpenURI, que
foi escrita por um dos meus Rubistas preferidos, Akira Tanaka. Ele simplificou a leitura de arquivos Internet, tornado-
a igual leitura de arquivos do seu computador.
Num captulo anterior, armazenamos suas idias diablicas em um arquivo texto. Voc l esses arquivos em Ruby
usando open.
require 'open-uri'
Files (arquivos) so objetos de entrada-e-sada. Voc pode ler e escrever em um arquivo. Em Ruby, todo objeto IO
(input-output) tem os mtodos read e write. O mtodo open passa um objeto IO para num bloco para voc usar.
IO a sua passagem para o mundo exterior. como os raios do sol passando atravs das barras da priso. (Entretanto,
voc no pode escrever (write) em uma pgina web usando OpenURI. Voc ter que achar um ferramenta para
copiar para o seu Web Server. Um cliente FTP, por exemplo.
Se algum quiser ler sua idia diablica de esconder alface nas cadeiras da igreja, presumindo que voc tenha
colocado isso numa pgina web:
require 'open-uri'
A biblioteca OpenURI tambm entende endereos de FTP. Isso amplia as possibilidades de onde voc pode
armazenar arquivos. No seu computador ou em algum outro lugar na Internet.
O cdigo acima recupera a lista de caminhes achados por pr-eventualistas e exibe somente as linhas que contenham
a palavra picape. Dessa maneira podemos limitar as descries e procurar somente as linhas pertinentes.
Acima, os colchetes so usados em uma string, de forma que seja pesquisado nessa string o que quer que esteja dentro
dos colchetes. Como a string 'picape' est dentro dos colchetes, a palavra picape
pesquisada na string line.
Quando uma pgina web carregada com read, toda a pgina carregada na memria. Normalmente isso
ocupa somente alguns kbytes. Mas se a pgina grande (vrios megabytes), melhor usar each_line, que carrega
uma linha de cada vez, evitando ocupar toda memria.
class IO
# Definio do mtodo each_line. Veja que ele no tem
# uma lista de argumentos. Blocos no precisam ser listados como argumentos.
def each_line
until eof? # at chegarmos ao final do arquivo...
yield readline # passe a linha para o bloco
end
end
end
A palavra-chave yield (produzir) a maneira mais fcil de se usar um bloco. Uma palavra. Da mesma forma que
uma cortina tem um puxador ou como uma maleta tem uma ala. Dentro de um mtodo, voc pode apertar o boto
piscante yield e ele ir rodar o bloco anexado a esse mtodo. Ele ficar brilhando em vermelho at que o bloco seja
executado. Ento voltar a piscar de novo e voc poder o boto novamente se quiser.
def yield_thrice
yield
yield
yield
end
Aperte o boto yield trs vezes rapidamente e o bloco ganha vida por trs vezes.
irb> a = ['primeiro, o nascimento', 'depois, uma vida cheia de imagens bonitas', 'e
finalmente, o fim']
irb> yield_thrice { puts a.shift }
# prints out:
# primeiro, o nascimento
# depois, uma vida cheia de imagens bonitas
# e finalmente, o fim
O mtodo shift tira o primeiro item de um Array. O barbeiro shift corta o cabelo fora e o entrega. Depois o
escalpo. E assim segue, reduzindo o pobre coitado a nada.
Voc viu blocos anexado a mtodos. Qualquer mtodo Ruby pode ter um bloco anexado no final.
# O estilo compacto de anexar um bloco a um mtodo.
# Aqui o bloco demarcado por chaves.
open( "idea.txt" ) { |f| f.read }
Se voc passar argumentos para o yield, esse argumentos tambm sero passados ao bloco. O bloco vai num
pequeno sidecar preso motocicleta do mtodo. O mtodo vocifera uma lista de argumentos, gritando para o bloco
mesmo com todo o vento enquanto eles esto dirigindo pelo deserto. O bloco bate no capacete com se dissesse: Ok,
entendi. Meu crebro captou tudo.
# O mtodo abre dois arquivos e repassa os objetos IO resultantes
# para o bloco anexo
def double_open filename1, filename2
open( filename1 ) do |f1|
open( filename2 ) do |f2|
yield f1, f2
end
end
end
Voc pode se perguntar o que o yield tem a ver com sinais de trnsito. Na verdade, essa uma boa pergunta, e que
eu acredito que tenha uma boa resposta. Quando voc executa um mtodo, voc est a esse mtodo o controle do seu
programa. Controle para fazer o seu trabalho e retornar com uma resposta.
Com yield, o mtodo est parando nessa interseco, devolvendo o controle para voc, para o seu bloco. O mtodo
est permitindo que voc faa o seu trabalho antes de retornar ao trabalho dele. Ento, enquanto o mtodo
each_line faz o trabalho de ler linhas de um arquivo, o bloco anexado ao mtodo each_line recebe a linha e
tem a chance de dar um passeio com ela no sidecar.
Em algum momento, voc tem que comear a modelar seu cdigo em algo mais elegante. Salve o mdulo acima em
um arquivo chamado preeventualista.rb.
Esse mdulo uma biblioteca muito simples para usar o servio dos Pr-eventualistas. exatamente assim que
bibliotecas so escritas. Voc constri um mdulo ou uma classe, grava em um arquivo, e, se ficou feliz com o
resultado, disponibiliza na web para o resto do mundo poder utilizar.
Esses vagabundos podem ento usar o seu mdulo da mesma forma que eu usei OpenURI anteriormente.
irb> require 'preeventualista'
irb> puts PreEventualist.search( 'caminhao' )
irb> puts PreEventualist.addfound( 'Why', 'conhecimentos em Ruby', 'Parque Wixl',
"Eu posso lhe dar conhecimentos em Ruby!\nVenha visitar poignantguide.net!" )
2. Enquanto Isso, O Porco-Espinho Faz uma Parada Para Abastecer
Olhe em Volta, disse Raposinho. Alguns de ns no tem tempo para buscas. Alguns de ns tem maiores
responsabilidades, trabalhos, assim por diante. Sustento, Entendeu?
Eiiii, meu TRABALHO era assassinar o drago!! gritou o coelho Wee, piscando seus olhos e e pulando furioso de
galho em galho de lagoa em lagoa. Seu focinho era uma GRANDE responsabilidade!! Seu hlito de fumaa era
problema meu!!!. Eu gastei cinqenta dlares em um txi APENAS para sair daqui, que foi outro ENORME
ENORME sacrifcio. Voc no tem nada sobre mim, nem uma simples acusao, todo a minha HEROICIDADE
absoflautamente impessegvel, toda a minha ABORDAGEM clarinentemente indamascvel, disse o Lester.
Quem Lester? falou Raposinho.
Lester meu taxista! Ele est estacionado na entrada do Array de O Meteoro Involuntrio
Dwemthy!! O Coelho ricocheteou enlouquecidamente como um Quando eu comecei a minha primeira
screensaver para um Super-Computador. Pergunte ao investigao sobre pr-eventualismo, me
Dwemthy!! submeteram a seguinte histria. Me falaram que
Bom, disse Raposinho. Ele se virou para olhar para Raposo, isso era tudo que eu precisaria saber para
que estava sentada olhando longe no horizonte. Espera a, eles entender a filosofia.
tem um estacionamento no Array de Dwemthy? Havia este escultor que no estava satisfeito com
SIM!! E um quiosque de Pretzel!!" seu trabalho. Ele tinha estudado principalmente
assuntos tradicionais, era excelente em esculpir
Mas um Array? Eles vendem churros?
tanto figuras humanas quanto em elaborar
CHOCOLAVA!! berrou o coelho. vegetao. E ele foi realmente um excelente
E aquelas cordas que brilham no escuro que voc pode prender escultor. Ele j no se sentia como se estivesse
no cabelo? Ou pode apenas ficar segurando elas ou fazendo sua marca sobre o mundo.
E o coelho comeou a divagar sobre Dwemthy e a lenda do Dwemthy e as formas de Dwemthy. Tal como a maioria
das estrias de Dwemthy, o relato do coelho era particularmente ornamentado. Cara plida, existem delcias que
somente eu devo abordar.
Por favor, nunca pergunte quem Dwemthy. Obviamente ele um gnio e nunca revelaria sua localizao ou
verdadeira identidade. Ele tem dinastias. Ele deu vidas a ogros. Em toda a parte, em todo o tempo, cavalos sentem seu
cheiro. Acima de tudo, ele conhece prazeres carnais. E pensar que este
Este o Array dele.
O Array de Dwemthy
Voc est na entrada do Array do Dwemthy. Voc um coelho que est prestes a morrer. E mergulha fundo no Array:
class Dragao < Criatura
vida 1340 # escamas duras
forca 451 # veias rgidas
carisma 1020 # sorriso escancarado
arma 939 # bafo de fogo
end
Uma escaldante LAVA BORBULHANTE infiltrou a cacofnica MINA adentrando as antigas copas da FLORESTA
DWEMTHY calcrios e noturnos gritos da barriga SELVAGEM E VORAZ STORKUPINE que come gansos
molhados LOGO DEPOIS ele que comeu alguns biscoitos Graham e um cochilo ao meio dia entre hipoptamos
famintos TECNICAMENTE RFOS mas veridicamente abrigados sobre sombrinhas de revendas de carros abaixo
ampolas destampadas de mnimas polpas ELIXIR AZUL que devem permanecer doravante QUIETO
DWEMTHY!!!
Se voc no entendeu o Array de Dwemthy, a culpa dele. Ele projetou o jogo para complicar nossas vidas e seria
mais simples, no fosse a inspiradora jornada que temos que prezar em nossos braos precisamente agora.
O Array de Dwemthy tem uma histria sinuosa e de grande impacto. No basta simplesmente dizer Labirinto de
Dwemthy mais e mais e esperar ter subsdios apenas a partir deste ato. Venha comigo, posso te levar de volta a alguns
anos atrs, de volta ao anos sessenta onde tudo comeou com metaprogramao e golfinhos.
Voc pode estar inclinado a pensar que metaprogramao mais uma palavra hacker e que inicialmente foi utilizada
incessantemente em ligaes privadas entre mquinas de fax. Juro por Deus, estou aqui para lhe dizer que isso mais
estranho que possa parecer. Metaprogramao comea com usando drogas na companhia de golfinhos.
Nos anos sessenta, um prolfico cientista chamado John C. Lilly comeou a fazer experincias com seus prprios
sentidos para descobrir o funcionamento de seu corpo. Eu posso atestar isto. Fao frequentemente quando estou de p,
no meio de uma estrada, segurando uma torta ou quando estou me escondendo dentro de uma catedral. Fao uma
pausa para me examinar. Isto provou que quase impossvel. Tenho preenchido trs pginas de caderno com notaes
algbricas, nenhuma delas conseguiu explicar nada. A torta, alis, foi muito de fcil de express-la matematicamente.
Mas o cientista Lilly passou por cima de suas experincias. Ele tomou LSD na companhia de golfinhos. Muitas vezes
em um lamentvel tanque de isolamento, escuro, cheio de gua salgada quente. Muito sombrio. Mas isto era cincia!
(Antes de voc ach-lo um criminoso: at 1966, LSD era fornecido pelos laboratrios Sandoz a qualquer cientista
interessado, sem encargos.)
Drogas, golfinhos e privao. O que levou Lilly a fazer uma incurso em coisas meta. Ele escreveu livros sobre
programao mental, comparando seres humanos e computadores. Voc pode escolher ingerir qualquer substncia que
queira durante esta prxima citao muito provvel que voc pegar um gro de sal mas eu te asseguro que
no haver um show do Grateful Dead num gramado e nenhum raver no poro.
Quando algum aprende a aprender, este algum est fazendo modelos, usando smbolos, fazendo
analogias, metforas, em resumo, inventando e usando linguagem, matemtica, arte, poltica, negcio, etc.
No lado crtico do crebro (crtex), esto as linguagens e suas conseqncias. Para evitar a necessidade da
repetio de aprender para aprender smbolos, metforas, modelos, eu simbolizo a idia subjacente nestas
operaes como metaprogramao.
John C. Lilly, Programming and Metaprogramming in the Human Biocomputer, Nova Iorque, 1972.
Ns aprendemos. Mas primeiro aprendemos a aprender. Montamos programao na nossa mente que o atalho para
mais programao. (Lilly um grande palestrante sobre programao cerebral e do sistema nervoso, o que ele
coletivamente chama de biocomputador.)
A metaprogramao de Lilly era mais sobre dar asas ao seu imaginrio, reinventando voc mesmo. Este tipo de
pensamento nos remete diretamente a pessoas que se interessam por Xamanismo, colocam suas mos sobre cartas de
tarot e que levantam cedo para aulas de karat. Eu acho que voc pode dizer que Metaprogramao uma coisa New
Age, mas tudo isso foi enfiado recentemente em um saco de dormir juntamente com a nerdice antiquada. (Se voc
chegou at aqui a partir de uma procura no Google por Metaprogramao em C++, fique vontade, a nica coisa
que eu te peo que voc queime aqueles atalhos neuronais que originaram a busca. Muito obrigado.)
A prpria Meta, no falada de maneira diferente, hoje em dia, por seu autor.
Toda resposta sensitiva realidade uma interpretao dela prpria. Besouros e macacos claramente
interpretam seu mundo, e agem baseados no que vem. Nossos sentidos fsicos so, eles mesmos, rgos
de interpretao. O que nos distingue de nossos companheiros animais que somos capazes de interpretar
estas interpretaes. Neste sentido, toda linguagem humana uma meta-linguagem. uma reflexo de
segunda ordem sobre a linguagem de nossos corpos sobre nosso aparato sensorial.
end
Preste ateno no fechamento das linhas do cdigo, especialmente na linha onde caracteristicas est sendo
definido. Todo o cdigo antes dessa linha determina o mtodo caracteristicas. Isto semelhante ao bsico do
bilhete de loteria do capitulo anterior.
class BilheteLoteria
end
Tanto caracteristicas como attr_reader so apenas mtodos de classe. Quando attr_reader usado
em BilheteLoteria, a metaprogramao inicia por trs dos bastidores e comea a estourar bales, criando
mtodos leitores para as variveis de instncia @numeros_escolhidos e @data_compra acima.
O cdigo para o mtodo caracteristicas a metaprogramao que eu tenho feito referncia. Comentrios no
cdigo revelam os trs estgios que o mtodo passa quando adiciona as caractersticas.
1. A lista de caractersticas passada para attr_accessor, que constri cdigo leitor e escritor para as
variveis de instncia. Um para cada caracterstica.
2. Mtodos de classe so adicionados para cada caracterstica. (O mtodo vida adicionado para a
caracterstica :vida). Esses mtodos de classe so usados na definio da classe assim como voc usaria
caracteristicas ou @attr_acessor. Dessa maneira, voc pode especificar a caracterstica, de acordo com
os pontos dados de uma caracterstica para uma determinada criatura.
3. Adicione um mtodo de inicializao que cria um novo monstro corretamente, com os pontos certos e
GANHANDO FORA! GANHANDO FORA! o monstro est vivo!
A beleza desses trs passos que voc ensinou ao Ruby como criar monstros para voc. Ento quando o Ruby obtm
as caractersticas:
class Criatura
caracteristicas :vida, :forca, :carisma, :arma
end
O Ruby preenche com o cdigo dos bastidores e transplanta um pulsante corao verde e da ignio no corpo dando
corda. O Ruby vai usar a metaprogramao da classe Criatura e ir construir todos os variados mtodos,
expandindo caracteristicas em uma lista como essa:
class Criatura
end
Agora, o Ruby vai aceitar gradativamente essas seis linhas de cdigo da classe Dragao, curto o bastante para
aparecer legal em cartas de jogos:
class Dragao < Criatura
vida 1340 # escamas duras
forca 451 # veias ressaltadas
carisma 1020 # sorridente
arma 939 # cospe fogo
end
Eval, o Menor Metaprogramador
Embora o cdigo de metaprogramao acima seja simplesmente Ruby, ainda assim pode ser difcil de seguir. Eu
compreendo totalmente, caso voc tenha chegado a esse ponto e seus olhos estejam girando em suas cavidades e seus
joelhos emperrados. A parte mais complicada de tudo isso acima so as linhas que chamam os mtodos
instance_eval e class_eval. Passe pomada nas suas juntas enquanto eu falo sobre eval.
Viemos falando sobre metaprogramao. Escrevendo cdigo que escreve cdigos. O mtodo eval reside neste
beco. O vagabundo eval pega o cdigo que voc havia guardado em uma string e executa o cdigo.
drgn = Dragao.new
# identifo a...
drgn = eval( "Dragao.new" )
# ou alternativamente...
eval( "drgn = Dragao.new" )
Aqui, vamos escrever um programa que tem um buraco. Ao invs de escrever um programa que cria um novo
Dragao, vamos deixar um buraco onde seria o Dragao.
print "Que classe de monstro voc veio combater? "
classe_monstro = gets
eval( "monstro = " + classe_monstro + ".new" )
p monstro
O programa pede por um monstro. Se voc digitar Dragao, ento a varivel da classe_monstro ir conter a
string "Dragao". Dentro do eval algumas strings sero adicionadas juntas para formar a string "monstro =
Dragao.new". E quando o eval executa essa string, a varivel monstro contm um objeto Dragao. Pronto para
batalha.
Isso maravilhoso! Agora podemos deixar que o jogador escolha um monstro! Claro, estamos confiando no jogador
para que ele fornea uma classe real de monstro. Se eles digitarem BruxaBotanica e no existe a classe
BruxaBotanica, eles tero uma exceo jogada na sua cara.
Ento, em resumo, o eval permite que voc crie um cdigo a medida que prossegue. O que pode ser til e pode ser
perigoso ao mesmo tempo.
Os mtodos instance_eval e class_eval usado na metaprogramao para a classe
@Criatura so levemente diferente do normal eval. Esses dois mtodos especiais passam o cdigo assim como o
eval faz, mas eles mergulham em classes e objetos e passam o cdigo l.
# O mtodo instance_eval executa o cdigo como se ele fosse executado dentro
# do objeto do mtodo de instncia.
irb> drgn = Dragao.new
irb> drgn.instance_eval do
irb> @nome = "Tobias"
irb> end
irb> drgn.nome
=> "Tobias"
Como voc pode ver acima, os mtodos instance_eval e class_eval tambm podem pegar um bloco de
cdigo ao invs de uma string. O que exatamente como as coisas foram feitas no Array de Dwemthy.
# Ataca o oponente
seu_golpe = rand( forca + arma )
puts "[Voc golpeia com #{ seu_golpe } pontos de dano!]"
inimigo.golpear( seu_golpe )
# Retaliao
p inimigo
if inimigo.vida > 0
inimigo_golpe = rand( inimigo.forca + inimigo.arma )
puts "[Seu inimigo golpeia com #{ inimigo_golpe } pontos de dano!]"
self.golpear( inimigo_golpe )
end
end
end
Esse cdigo adiciona dois mtodos a Criatura. O mtodo golpear que reage ao golpe de outra Criatura. E o
mtodo lutar que permite que voc coloque os seus prprios golpes contra aquela Criatura.
Quando a sua Criatura leva um golpe, um pouco da defesa contribui e o seu valor carisma usado para gerar
um aumento de poder. No me pea para explicar os segredos por trs deste fenmeno. Um nmero aleatrio
escolhido, uma matemtica simples feita e se voc tiver sorte, voc consegue alguns pontos vitais. @vida +=
aumento_poder / 4.
Ento o golpe do inimigo est dado. @vida -= dano. assim que o mtodo da Criatura#golpear trabalha.
O mtodo lutar checa se a sua Criatura est viva. Em seguida, um golpe aleatrio dado no seu oponente. Se o
seu oponente sobreviver a este golpe, ele ganha uma chance de atacar de volta. Estas so as atividades do mtodo
Criatura#lutar.
Irei explicar o ArrayDwemthy em um segundo. Realmente explicarei. Estou me divertindo fazendo isso. Por hora,
vamos nos concentrar em golpear e lutar.
Apresentando: Voc.
Voc pode certamente experimentar derivaes deste coelho. Mas o oficial Paradigma de Dwemthy explicitamente
denota o cdigo - e o personagem em geral - escrito abaixo. Salve isto como coelho.rb.
class Coelho < Criatura
caracteristicas :bombas
vida 10
forca 2
carisma 44
arma 4
bombas 3
# bumeranguinho
def ^( inimigo )
lutar( inimigo, 13 )
end
# a espada do heri ilimitada!!
def /( inimigo )
lutar( inimigo, rand( 4 + ( ( inimigo.vida % 10 ) ** 2 ) ) )
end
# alface ir formar a sua fora e fibra alimentar extra
# voar na cara de seu oponente!!
def %( inimigo )
alface = rand( carisma )
puts "[Alface saudvel lhe d #{ alface } pontos de vida!!]"
@vida += alface
lutar( inimigo, 0 )
end
# bombas, mas voc possui somente trs!!
def *( inimigo )
if @bombas.zero?
puts "[HUMM!! Voc est sem bombas!!]"
return
end
@bombas -= 1
lutar( inimigo, 86 )
end
end
Agora, mostre-se.
irb> c = Coelho.new
irb> c.vida
=> 10
irb> c.forca
=> 2
Bom, bom.
Estes so os exemplos vivos da monstruosidade do Array de Dwemthy. Eu no sei como eles chegaram l. Ningum
sabe. Na verdade, eu acho que o @ IntrepidoCiclistaDecomposto@ pedalou at aqui a toda velocidade. Mas os outros:
NINGUM sabe.
Se isso realmente importante para voc, vamos apenas dizer que os outros nasceram l. Podemos seguir em frente??
Conforme o Array de Dwemthy vai ficando mais complexo, o desafio se torna mais difcil.
dwary = ArrayDeDwemty[MacacoIndustrialEntusiasmante.new,
AnjoDosAnoes.new,
TentaculoViceAssistenteEOmbudsman.new,
CervoDeDentes.new,
IntrepidoCiclistaDecomposto.new,
Dragao.new]
Combata o Array e os monstros aparecero ao passo que voc continua. Boa sorte, e que voc retorne com histrias
horrveis e nenhuma garra de anjo cravada atravs de seus ombros.
Comea aqui:
irb> r % dwary
Ah, e nada deste negcio Eu sou muito jovem para morrer. Estou farto desta besteira. No vou mais tolerar seus
insultos aos nossos jovens que ainda nos restam. Eles so nosso futuro. Assim que nosso futuro estiver terminado, ai
sim.
Por Trs do Array de Dwemthy
Avance para o tempo onde os ventos j tenham se acalmado. O Drago foi derrotado. Os impuros se curvaro. Ns
amamos voc. Ns somos leais a voc.
Mas o que esta centopia est mordiscando seu tmpano? Voc enfia o dedo para tir-lo, mas no consegue! Maldito!
aquele infernal Array de Dwemthy novamente. Se explique Dwemthy!
Aqui, eu revelo o prprio Array para voc.
At agora, provavelmente voc est se sentido muito familiarizado com herana. A classe DwemthysArray herda de
Array, portanto se comporta como um. Para tal sendo um mistrio, assustadoramente curto, no?
Portanto um Array. Preenchido com monstros. Mas o que este cdigo extra faz?
Inspect
O mtodo inspect no realmente uma parte necessria do Array de Dwemthy. algo adicionado a Dwemthy
como uma cortesia para seus visitantes. (Muito o chamam de pervertido, muitos o chamam de austero, mas todos ns
somos ignorantes para ir sem admirar o trabalho que ele despendeu por ns.)
Cada objeto em Ruby possui um mtodo inspect. Isto est definido na classe Object, ento ele adiciona atravs
da genealogia para cada pequenino objeto que nasce.
irb> o = Object.new
=> #<Object:0x81d60c0>
irb> o.inspect
=> "#<Object:0x81d60c0>"
Voc percebeu? Sempre que criamos um objeto no irb, essa chamativa palavra #<Object> apresentada! Isto
um pequeno nome identificador para o objeto. O mtodo inspect cria este identificador, que apenas uma string.
irb> class Coelho
irb> attr_accessor :slogan
irb> def initialize s; @slogan = s; end
irb> def inspect; "#<#{ self.class } diz '#{ @slogan }'>"; end
irb> end
O fato : irb est respondendo. Cada vez que voc executa algum cdigo no irb, o valor de retorno daquele cdigo
inspecionado. Que prtico. uma conversinha entre voc e o irb. E irb est apenas reiterando o que voc est
dizendo, ento voc mesmo pode ver.
Voc poderia escrever seu prprio prompt Ruby de uma forma muito fcil:
loop do
print ">> "
puts "=> " + eval( gets ).inspect
end
Este prompt no ir permitir que voc escreva cdigo Ruby mais longo do que uma nica linha. No entanto, esta a
essncia do Ruby interativo. Como que voc gosta? Dois de seus conceitos recentemente aprendidos vieram juntos de
um modo mais saboroso. O eval pega o cdigo digitado e o executa. A reposta de eval ento inspecionada.
Agora, como voc est combatendo monstros no irb, o Array de Dwemthy ser inspecionado e respondido com os
monstros que voc deixou de lutar.
Method Missing
Voc no odeia quando grita Deirdre! e aproximadamente dez pessoas respondem? Isto nunca acontece em Ruby. Se
voc chamar o mtodo deirdre, somente um mtodo deirdre responde. Voc no pode ter dois mtodos com o
mesmo nome. Se voc adicionar um segundo mtodo deirdre, o primeiro desaparece.
Voc pode, no entanto, ter um mtodo no qual responde para muitos nomes.
class ChamadorDeNome
def method_missing( nome, *args )
puts "Voc est chamando '" + nome + "' e voc diz:"
args.each { |diz| puts " " + diz }
puts "Mas ningum est l ainda."
end
def deirdre( *args )
puts "Deirdre est bem aqui e diz:"
args.each { |diz| puts " " + diz }
puts "E ela ama cada segundo disso."
puts "(Eu acho que ela pensa que voc potico.)"
end
Quando voc chamar o mtodo deirdre acima, eu tenho certeza que voc sabe o que vai acontecer. Deirdre vai
amar cada segundo disto, voc e suas fascinantes poesias.
Mas e se voc chamar simon?
irb> ChamadorDeNome.new.simon( Ol?', 'Ol? Simon?' )
Voc est chamando `simon' e voc diz:
Ol?
Ol? Simon?
Mas ningum est l ainda.
Sim, method_missing (mtodo faltando) como uma secretria eletrnica, que intercepta a chamada de
seu mtodo. No Array de Dwemthy nos usamos um desvio, ento quando voc ataca o Array, ele passa o ataque
diretamente para o primeiro monstro no Array.
def method_missing( meth, *args )
resposta = first.send( meth, *args )
# ... cdigo recortado aqui ...
end
5.
De qualquer maneira, vocs devem admitir que ele um pssimo Presidente, disse Raposinho. Por que o
Presidente Marcos tem um coelho como Vice Presidente das Raposas."
O Vice Presidente? o coelho com as sobrancelhas?
No, o coelho com os enormes lbios de salsicha, disse Raposinho.
Mas sua conversa foi abruptamente interrompida por um gato sardento que surgiu do cu em cima da calada.
O que isto significa?!
de _conjectura_*. Como eles podem presumir que sabem o cenrio do meu drama familiar? Eu amo minha irm. Por
um longo tempo, eu a adorei. (Esta minha irm Quil.)
Eu admito que houve um dia realmente doloroso h alguns meses atrs e eu meio que me apavorei. Eu estava deitado
na cadeira de piscina no quintal da minha me. Eu tinha uma latinha de Dr. Pepper e um pedao de torta alem de
chocolate. Estava comendo com um garfinho de criana. Todo o resto estava na lava-louas, isso era tudo que eles
tinham. Trs dentes.
Minha me comeou a falar sobre Quil. Tudo sobre quanto dinheiro ela estava esbanjando em calas e bolsas. Uma
bolsa de quinhentos dlares. Ento ela disse, Ela est perdendo isto. Ela parecia totalmente dopada no telefone. (Ela
cismou com isto, Quil estava fumando maconha e gostando.)
Ento passei a notar o quo observadora minha me podia ser. Por isto que, quando ela disse, Na verdade acho que
ela est na cocana, Eu fisicamente levantei e arremessei meu refrigerante do outro lado do quintal.
Ele foi parar navegando entre os troncos em algum lugar. Ns ficamos conversando por um tempo, estava escuro
quando a latinha voou. Eu marchei um pouco. Ento gritei a plenos pulmes.
Meu tio Mike estava parado com a porta de vidro aberta, me encarando. Ele disse algo totalmente nervoso como, Ah,
ok. Bem, eu vou E o ch no seu copo estava balanando para frente e para trs, derramando tudo. Ele desapareceu.
Ele no muito bom em falar coisas para as pessoas. Ele mais um assoviador. E ressonante.
Ento, sendo completamente honesto, sim, eu fiquei um pouco bravo. Eu fiquei bravo. Voc sabe. Eu lidei com isto.
Quil me liga regularmente. Por alguma razo estpida, raramente ligo para ela.
E mais, ela no acabou se matando. Ento isto no assunto. Quem pode saber se isso era real. Ela apenas tomou
muita vodca. E ela pequena. Ento foi apenas assustador ver a Quil embebedar-se daquele jeito. Quer dizer forar-se
a isso.
Mas por que falar sobre isso? Isso far apenas ela sentir que estou desapontado. Ou que sou um idiota.
Bem, sa um pouco da linha. Onde eu estava? Blix est basicamente ajudando os raposos, colocando-os na trilha do
seu caminho. Sim voltando aquilo tudo.
O que voc est vendo acima usa o mtodo % nas classes String. Este mtodo pega um string e um array e
mastiga-os para criar uma nova string. Os itens da lista so puxados (em ordem) e colocados em seus lugares
reservados. o comeo de um dia de negcios e os sapos j fizeram seu trabalho.
# Observe, aqui est o mtodo String#% chamado como os outros mtodos.
irb> "Mexa-se por favor, %s.".%( 'sapo desdentado' )
=> "Mexa-se por favor, sapo desdentado"
# Agora vamos chamar da maneira mais bonita, com o sinal de porcentagem
# entre o string e o array.
irb> "Aqui est sua frase 1098 para o ano, %s." % ['sapo com dentes']
=> "Aqui est sua frase 1098 para o ano, sapo com dentes."
Isto tambm est disponvel como o mtodo Kernel::format ou o mtodo Kernel::sprintf (Na linguagem
C, tem um mtodo sprintf que opera assim.)
irb> format "Sapos so empilhados %d de profundidade e viajam a %d mph.", [5, 56]
=> "Sapos so empilhados 5 de profundidade e viajam a 56 mph."
Para a maioria das partes, voc precisar somente %s (strings), %d (nmeros inteiros) ou %f (nmeros float)
especificadores de formato. O smbolo %p ir executar inspect num objeto.
Sim, ento, o formato sapo realmente til para construir strings que so montados por diferentes tipos de dados. Voc
pode aprender todos os vrios tipos de especificadores de formatos lendo a pagina ri sprintf. S te darei alguns
rpidos indicadores.
Vamos dizer que voc tem um array mas quer que os itens apaream em uma ordem diferente na string. Numa
situao como esta, voc pode identificar itens especficos (colocando 1$ para o primeiro item, 2$ para o segundo, e
assim por diante) depois do sinal de porcentagem.
irb> "Este nibus tem mais %1$d paradas antes das %2$d horas. Isto so mais %1$d paradas." %
[16, 8]
=> "Este nibus tem mais 16 paradas antes das 8 horas. Isto so mais 16 paradas."
A segunda dica que tenho para voc que pode destinar um certo nmero de caracteres para cada item, uma largura. E
se um item menor que a largura, espaos extras sero usados antes do item. Para preench-lo. Se a largura um
nmero negativo, o item ser forado para esquerda e o preenchimento vir depois dele.
# D a um item 30 caracteres de largura
irb> "Na traseira do nibus: %30s." % ['sapos']
=> "Na traseira do nibus: sapos."
Raposinho continuou olhando para o motorista do nibus. Lembre-se, ele no entraria no nibus!
Qual o problema? disse Raposo. Voc no pode entrar e ficamos no corredor?
Voc realmente quer entrar neste nibus? Aquele motorista no tem mos, disse Raposinho, falando perto de
maneira a aquietar Raposo, e tudo o que ele tem, ao invs de mos, so copos com canudos.
Os raposos seguiram Blixy por trs da loja de tinta pelo asfalto rachado e irregular. Todas as lojas na pista dilapidada
se inclinaram em ngulos entre elas. Em alguns lugares, placas da calada sobressaam da terra, formando uma
arriscada passagem, uma desordenada pilha de bordas. Quase como se os planejadores da cidade tinham esperado para
pagar tributo para as placas tectnicas. Uma pequena farmcia tinha deslizado para baixo da superfcie, quase longe de
vista.
Verdadeiramente, embora era colorido. A loja de tinta tinha jogado para fora as tintas velhas diretamente em seus
vizinhos. As lojas mais prximas da loja de tinta foram obstrudas com centenas de cores, ao longo dos parapeitos das
janelas e nas calhas de chuva. Sim, nas paredes e calamento.
Basicamente, comeando com a entrada da loja de tintas, a avenida entrou em erupo em uma gigantesca
incongruente mercado infelizmente colorido.
Mais a diante, um escritrio de um dentista foi preparado com a tinta vermelha, um artista inexperiente descreveu um
grande beb que tinha cado atravs de uma chamin e chegado em um lareira completamente de fuligem. Levantou
uma nuvem grossa e preta de cinzas durante o impacto, facilmente confundido pelo cabelo grosso sobre os braos e
costa da criana. A criana olhou longe e viu que era nova para ter muito cabelo, mas l eles eram: rico, ondas loiras
qual caram generosamente da cabea da criana. Sob as pernas da criana foi pintado a palavra BREWSTER.
O mesmo artista tinha batido na biblioteca prximo a loja e tinha batido com pressa junto a um mural de carro
esportivos verde sendo puxado da lama por uma equipe de bebs sem perna puxando-os com correntes brilhante.
Outra vez, a drstica onda loira!
Eu preciso de respostas, disse Raposo, que tinha terra para uma parada em frente de vista.
Eu estou comeando acreditar que no existe, disse Raposinho. Talvez estes so as respostas.
Brewster? disse Raposo. Ele caminhou mais prximo a biblioteca e tocou o mordente de um dos crianas sem
perna que estava mais prximo do ponto de vista. O mordenite da criana apareceu com a mandbula de baixo.
Blix foi a outras duas casas para baixo, navegando atravs da construo torta de alvenaria, a sarjeta pavimentada que
o conduziu para R.K.s Gorilla Mint, com a etiqueta metlica leu sobre a porta. O edifcio foi emplastrado com
logotipos miniaturas para a variedade de opes de pagamento e uma aceitvel identificao em R.K.s Gorilla Mint.
Mesmo as barras sobre a janela foram alinhadas com divulgaes de seguro e avisos de seguranas e selos de
autorizao do governo, assim como adicionando a todos estas, etiquetas coberta com papel carbono cobrindo posteres
rasgados e propagandas. E tudo misturado com respingos de tinta que penetrou-os satisfatoriamente.
Eu gosto da maneira que sinto o papel fresco contra minha lngua, disse o gorila no caixa. os dedos dele esfregaram
silenciosamente as notas. Ele aproximou seu rosto em direo a moeda fresca e passou em seu nariz o dinheiro macio.
O R.K. est aqui nessa noite? perguntou Blix.
R.K no est, disse o caixa gorila. ele voltou-se para os trs viajantes e espalhou o seu dinheiro na superfcie do
caixa, espaando-os igualmente e alinhando todos os cantos impecavelmente. Agora, qual destes vocs acham que
vale mais?
Os raposos olharam sobre as diferentes notas e Raposinho murmurou a si mesmo, Bem, talvez no, mas eu
apostarei Espere, uma dessas tem bananas nela? Por que esta no, nenhuma fruta ou corda de pular ou terrvel,
isto difcil!" e em uma voz mais baixa, To difcil ler. O que isso quer dizer? Smbolos ou alguma coisa? Se todas
essas notas tm smbolos, ser impossvel para ns compreender qual a de maior valor."
Foi por isso que eu disse, Adivinhe. O gorila bateu cada nota em ordem. Veja, voc tem uma em cinco chances."
A menos que os smbolos signifiquem alguma coisa, disse Raposo. A no ser que ns pudermos compreender
Ns podemos compreender, disse a Raposinho.
No, disse o gorila. os smbolos no tm significado algum.
Seja quem for que criou o dinheiro pensou em algum significado para eles, disse Raposinho. Por que usar
_este_smbolo? Ele apontou para uma conjuno (e comercial) impressa em tinta escura.
Sim, ns vimos voc cheirando o dinheiro e fantasiando a respeito l atrs, disse Raposo. Eu aposto que estes
smbolos significam todo tipo de coisas para voc!
No, Eu acho que no, disse o gorila.
Se eu puder avaliar por este ponto, eu acho que os smbolos tm significado. Eles podem no ser carregados com
significado, eles podem no estar transbordando significado atravs das rachaduras, mas eu estou certo que existe uma
lasca de significado.
irb> $:
=> ["/usr/lib/ruby/site_ruby/1.8", "/usr/lib/ruby/site_ruby/1.8/i686-linux",
"/usr/lib/ruby/site_ruby",
"/usr/lib/ruby/1.8", "/usr/lib/ruby/1.8/i686-linux", "."]
Variveis que comeam com o smbolo monetrio so variveis globais. Elas podem ser vistas de qualquer lugar do
programa, de dentro de qualquer escopo. (Dr. Cham usava esta varivel enquanto bisbilhotava em volta da baia do
computador dos Originais.)
Ento porque o sinal de dinheiro seguido por dois ponto representa um array de todos os diretrios onde Ruby ir
procurar quando voc tenta carregar um arquivo com @require@*? O smbolo de dinheiro significa global. Mas por
que os dois pontos?
Historicamente, em muitos sistemas operacionais, uma lista de diretrios continham os dois pontos que separava cada
entrada. Eu gosto de ver os dois pontos como um par de olhos, vasculhando os diretrio por arquivos. Ns
armazenamos nossa lista de observao atrs destes olhos.
Aqui esto mais algumas variveis globais especiais:
irb> $" # A varivel $" contem todos os arquivos que foram carregados com 'require'
=> ["irb.rb", "e2mmap.rb", "irb/init.rb", ... "rbconfig.rb"]
# Estes arquivos esto armazenados em outros lugares, mas seus
# cdigos esto sendo usados neste programa. Como se estivssemos
# referenciando o trabalho de outra pessoa -- estas so as notas de rodap
# -- por isso as aspas duplas.
Eu no me lembro de voc. Blix olhou para o gorila com muito interesse. Voc um dos filhos de R.K. ou algo
parecido?
Ah, vamos l! disse Raposinho, segurando uma nota com uma exclamao no nariz do gorila. No me diga que
isso no significa nada para voc! Esta aqui provavelmente muito importante j que tem uma exclamao nela.
Talvez ela pague por coisas de emergncia! Contas de hospital ou algo do gnero!
Sim, cirurgia! disse Raposo.
O gorila olhou para os raposos com desgosto sob a borda de seu bon. No, vocs esto errados. Vocs no podem
pagar por cirurgias com isso.
Mas voc entende nosso ponto de vista, disse Raposinho. Ele agarrou algumas das outras notas. E voc me diz que
esta conta no pode pagar por cirurgias? Bem isso parece um propsito especfico no relacionado a cirurgia. Agora,
esta aqui com o interrogao. Para que ela serviria?
Ei, me de estas a, o gorila apanhou as notas sobre o balco, mas seu longo polegar continuava a ficar no caminho e
toda vez que ele achava que tinha pegado as notas, ele percebia que s tinha conseguido pegar seu prprio dedo.
Ei, ei, olhem, ele est nervoso, falou Raposo, aplaudindo com alegria. Eu me pergunto por qu. Voc percebeu
quo bravo ele ficou uma vez que falamos todos estes significados interessantes? *Ns estamos espertos com voc!
*Ns entendemos seu jogo to rpido!*
Totalmente! disse Raposinho, um de seus braos pego pelo gorila, o outro brao agitando uma nota que exibia um
travesso. Esta aqui para comprar suprimentos para o cho, talvez at grandes rolos de ladrilhos e tecidos
impermeveis
V, disse Raposo, trabalhando para soltar os dedos do gorila, ns apenas temos que descobrir o que mais caro:
cirurgia ou tecido impermevel! Isso _to fcil_
NO NO! berrou o gorila, chacoalhando Raposinho e o batendo com suas palmas. VOC NO SABE NADA
SOBRE DINHEIRO DE MACACO!! VOC NO TEM MESMO SEU PRPRIO TIPO DE DINHEIRO!!"
Ns poderamos facilmente ter nossos prprios tipos de dinheiro!" Disse Raposo, pegando o bon do chimpanz e
jogando-o para o fundo da sala, onde ele navegou para trs de uma parede de caixas de depsito de segurana. E
seu chapu est longe daqui!
Vamos l, devolva logo as notas dele, disse Blix, acenando os braos sem chance de ajuda, fora do jogo.
Poderamos realmente ter a ajuda deste cara.
Pare de bater em mim! gritou Raposinho. Estou quase entendendo esta aqui com os pontos!!
De repente, com grande preciso e sem avisar, Raposo agarrou o nariz do macaco e bateu sua cara contra o balco.
As canetas e tintas em sua superfcie agitaram-se e Bam! disse Raposo. Os olhos do gorila viraram-se com
sonolncia a medida que seus braos ento seu pescoo e ento sua cabea escorregaram para o cho atrs do
balco.
Aqui esto mais algumas variveis globais que talvez voc possa querer usar:
irb> $/ # O $/ a linha separadora, ele normalmente configurado para \n, o qual
representa o _Enter_
=> "\n" # ou "o final da linha". A barra representa uma espada que corta e reduz linhas
em um arquivo.
# Se voc mudar a linha separadora, voc muda como os mtodos trabalham, tal como o
each_line.
# Veja o que acontece quando eu mudar a linha separadora por uma vrgula.
irb> $/ = ','
irb> "Jeff,Jerry,Jill\nMichael,Mary,Myrtle".each_line { |nomes| p nomes }
=> "Jeff,"
=> "Jerry,"
=> "Jill\nMichael,"
=> "Mary,"
=> "Myrtle"
# O separador split est normalmente vazio, que significa que String#split separar
# a string onde h um espao em branco.
irb> "vela sopa\nmackarel".split
=> ["vela", "sopa", "mackarel"]
irb> $; = 'a'; "vela sopa\nmackarel".split
=> ["vel", "sop", "\nm", "ck", "rel"]
Fora do Casa da Moeda do Gorila, Blix repreendeu aos raposos. Ns poderamos ter aproveitado a ajuda desse cara!
Se sabe onde est R.K., ns poderamos usar a astcia dele!
No precisamos do dinheiro do macaco! disse o Raposinho. Podemos criar nosso prprio dinheiro!
Ns podemos suportar pulseiras eletrnicas! disse o Raposo.
Seu dinheiro sem valor, disse Blix. O dinheiro do gorila. No tem valor. Ele pior do que os cristais azuis.
Mas serve para uma finalidade, disse o Raposo.
No ele no serve, disse Raposinho. Ele apenas disse que o dinheiro no tem importncia.
Mas sobre o tapete impermevel e as cirurgias? disse Raposo.
Sim, disse o Raposinho para Blix. O que dizer do tapete impermevel e as cirurgias?
Se todos os hospitais possuem uma equipe de gorila e toda as casas receberam uma rede de melhorias estritamente
operadas por gorila, ento SIM voc poderia comprar o tapete impermevel e as cirurgias. Mas eu garanto que
voc teria um tapete impermevel desleixado e muitas cirurgias horrveis. No acho que voc conseguiria tir-lo desta
economia com vida.
Assim, se R.K. to esperto, disse o Raposo, dando risada dissimuladamente, por que imprime tal moeda sem
valor?
Ele a tampa para outras atividades, disse Blix. Alm do que, se voc to esperto, por que voc recorreu
violentamente derrotando aquele pobre gorila?
Eu suponho que foi um mau jogo, afirmou Raposo, pendendo sua cabea. Meu amigo, direi a voc que fiquei de
saco cheio o dia inteiro.
E sua raiva finalmente levantou seu focinho fumegante! falou Raposinho. Voc finalmente est vivendo a vida
altura do seu cavanhaque.
Percorriam sobre as pistas, os dois raposos distrados no seu rumo, mas divertindo-se agora que tinham Blix
conduzindo-os pelo caminho com tanta urgncia. Eles passaram o tempo vagando descuidados bem atrs de Blix e
gastando sua tarde importunando a maioria dos pedestres.
Um dos alvos dos seus permanentes comentrios eram Os Transportadores Alados de Pergaminho, pares de morcegos
que carregam documentos que precisam ser imediatamente autenticados. No pode haver nenhum atraso, eles devem
ser ligeiros, no h mesmo tempo para enrolar o pergaminho, no, eles devem deixar cair seus queijos suos e sair
pela porta.
Estes correios assemelham-se a um tipo de construo do Ruby chamado tipos delimitados. Uma srie longa de
caracteres equivale ao pergaminho, defendido em cada lado por um morcego cercando suas asas onduladas para
manter o pergaminho unido. O morcego da ponta usa um chapu em que est escrito %w, que identifica o pergaminho
como um conjunto de palavras.
irb> bats = %w{Os Transportadores Alados de Pergaminho}
=> ['Os', 'Transportadores', 'Alados', 'de', 'Pergaminho']
Os morcegos de %w e seus pergaminhos, quando alimentados dentro do Ruby, emergem como um array de palavras.
Esta sintaxe um atalho caso voc no queira atravessar o problema de decorar cada palavra com vrgulas e citaes.
Voc est com pressa, tambm, no pode haver nenhum atraso. Voc rabisca as palavras entre os morcegos e deixa o
Ruby descobrir onde cortar.
Outros morcegos, outros chapus. Por exemplo, o chapu de %x funciona como um programa externo.
irb> %w{ruby --help}
=> ["ruby", "--help"]
irb> %x{ruby --help}
=> "Usage: ruby [switches] [--] [programfile] [arguments] ..."
Meu favorito o chapu Q. que pode tambm ser escrito apenas como %. Isto atua como uma string de aspas duplas,
mas fica legal quando usado com strings que ocupam muitas linhas. Por exemplo, digamos que voc quer adicionar
um novo mtodo com eval.
m = "morcegos!"
eval %{
def #{ m }
puts "{" * 100
end
}
Assim como se faz com uma string de aspas duplas, voc pode usar interpolao de strings com vitrias-rgia (#).
O mtodo clone faz uma cpia exata de um objeto Ruby. Como isso difere de uma atribuio comum?
irb> arvore_charles_william_iii = arvore
=> [:fruta, :fruta, :fruta]
A atribuio de um objeto a variveis apenas cria mais apelidos. O Array acima pode ser chamado
arvore_charles_william_iii agora. Ou o mais curto arvore. O mesmo objeto, mas nomes diferentes.
Entretanto, um clone uma cpia de um objeto. Voc pode alter-lo sem afetar o original.
irb> filhoarvore << 'flor'
=> [:fruta, :fruta, :fruta, 'flor']
irb> arvore
=> [:fruta, :fruta, :fruta]
Contudo, o mtodo clone no faz cpias de tudo que est amarrado ao objeto. No array acima, apenas o array
copiado, no todos os smbolos e strings que esto dentro.
Voc tambm pode ver o mtodo dup sendo usado para copiar objetos. O mtodo dup faz cpias que no so to
exatas. Por exemplo, existem objetos em Ruby que esto congelados e no podem ser alterados. Se voc fizer um
clone do objeto, ter uma cpia exata que tambm estar congelada. Se voc usar dup, voc ter uma cpia
descongelada que voc poder alterar se quiser.
O mtodo clone tambm copia a metaclasse de um objeto, enquanto o dup no.
irb> o = Object.new
irb> class << o
irb> def nuncamais; :nuncamais; end
irb> end
irb> o.clone.nuncamais
=> :nuncamais
irb> o.dup.nuncamais
# NoMethodError: undefined method `nuncamais' for #<Object:0xb7d4a484>
# from (irb):7
Nem sempre voc precisa fazer cpias dos objetos, de qualquer maneira, j que muitos mtodos como collect,
gsub e format fazem cpias para voc como parte trabalho deles.
Sobre as colinas e nos vales, eles correm pela grama onde perambula o Veado da Fumaa Rosa Bafejante. O sol estava
encoberto pelas pesadas nuvens rosas, repletas de linguagem de veado, colorindo o horizonte com um gradiente de
toranja e produzindo um brilho sobre a colina. As nuvens deslizavam umas sob as outras, algumas flutuando para
cima, com destino a parentes canadenses. Outras aterrisando numa distncia legvel dos cascos de quem v.
Vamos parar! Por favor! gritou Raposo. Voc no espera que corremos no meio desta penugem irrespirvel"!
Por que voc est gritando? falou Blix, enquanto uma fina camada de nuvens flutuava ars de suas pernas. Voc
no precisa levantar sua voz alm de um sussurro. Estas longas e finas nuvens so geralmente s um murmuro ou um
suspiro Elas podem conseguir nem mesmo chegar at seu destino.
Todos esses escritos nas nuvens so conversa de cervos? disse
Raposinho. Bifes e Escorregadores
Ajudem-me! Onde vocs esto, caras? Raposo abaixou-se Meus tios amam toboguas e churrascarias. Eles
atravs de uma tempestuosa lengalenga formada por uma densa tm dias de tobogua seguidos por um pulo na
ondulada fumaa e moitas afiadas. Ele girou em todas direes, churrascaria do Joey. Eu odeio a churrascaria do
Algum grite se estiver a! Joey. L tudo muito grande, carne com cara de
Procurou por uma fenda na densa matria, penteando para frente sola de sapato. Borrachenta. Misturado com
com suas mos. As eloqentes, furiosas nuvens responderam-no fedor de cloro dos meus tios.
espetando-o para adiante, forando-o para cantos apertados em Dedos enrugados nas fatias de carne
suas breves pausas entre as frases. Ele ficou em um sumidouro e Revoltante.
manteve sua cabea baixa a medida que as cascatas de fumaa
agitavam-se adiante. Agora a hora dos bifes e tobogua se unirem de
maneira nojenta. Meus tios tiveram bifes e
Sim, os cervos podem ler estas coisas, afirmou Blix. Eles toboguas a vida inteira. A dinastia dos bifes e
apenas encaram seus alvos e atiram-nas de suas narinas. Escutei dos toboguas tem que acabar. Eu farei os dois
uma vez sobre um cara que tinha cavalgado em um poema de nadarem juntos contra a natureza!
amor cervdeo.
Como isto:
Sem chance, falou Raposinho.
Entrego os bifes para um cavaleiro a
Sim, disse Blix. E este cara era eu. Blix alcanou seu ombro e
bordo do tobogua. O cavaleiro olha para
juntou-se a uma espiral de fumaa que girava acima de sua cabea.
o salva-vidas. O salva vidas diz espere ai.
Voc apenas tem que saber quais nuvens so fracotes e quais so
O cavaleiro olha novamente. O salva-
pomposas. Blix deixou a nuvem pux-lo e quando a nuvem voou
vidas no fala mais nada. E ento, agora
para cima, Blix perdeu seu apoio e manteve seus ps movendo
a hora. Vai garoto, vai! E o olhar daquela
vagarosamente ao longo do cho. "V, est aqui uma das boas,
criana enquanto escorrega tobogua
longa como um cabo de vassoura. Um cara descobriu uma uma
abaixo, patas cheio de pedaos de bife!
vez que tinha a forma exatamente igual a de um carro: pra-brisa,
Vai garoto, vai!
airbags laterais para o motorista, direo hidrulica. "
Excepcional!" Crianas escorregando encima dos bifes.
E este cara era Por segurana, no queremos que os
escorregadores fiquem com cinco bifes de
Ele era! E Blix escalou sobre a longa nuvem gelada, com seus profundidade, um em cima do outro.
hierglifos pendurados, e manteve-se em p orgulhosamente, Ou os bifes fazem o deslizamento, em
flutuando bem acima da pontuda sombra do raposo. suas prprias sunguinhas.
Ah, eu poderia fazer isso disse Raposinho. Eu e Raposo Ou as pessoas com sungas de bife.
andamos de jetski o tempo todo. Eu fico em p no meu jetski. Pessoas e bifes, lado a lado.
igualzinho a isso. Bifes descendo toboguas feitos de bifes.
Raposo lanou-se sobre uma fumaa descendente, chacoalhando Bifes descendo toboguas feitos de
sua frase, cujas letras se descolaram e se espalharam pelo cho pessoas.
com palavras embaralhadas, mas ele tinha apenas sucedido em E lgico, pessoas comendo bifes, mas
alcanar as partes depressivas das correspondncias dos cervos, suas lnguas revelando-se como tobogua
que se manifestavam como uma mida e opaca nvoa. e tendo que empurrar as carnes para o
comeo do tobogua, o que impossvel,
Enquanto isso, sua contraparte pequena agarrou um estreito trem ento um salva-vidas tem que escalar o
de fumaa que passava sob seu brao. Ele foi aerotransportado e tobogua e enfiar a carne guela abaixo.
gritou, Tallyho! Mas se segurou muito firmemente e a nuvem
tobogua e bifes comendo pessoas.
evaporou sob seu brao e o enviou de volta ao cho com um
pequeno salto. tobogua e bifes virando amigos depois
de sentirem o cheiro da respirao de
Dado que est apenas comeando seu uso de Ruby, voc pode no cada pessoa.
ter entendido completamente as expresses regulares (ou regexps) Ou, os bifes protegem os toboguas, mas
de incio. Voc pode at mesmo se encontrar recortando as regexps os toboguas no so recprocos. Os
da Biblioteca de Expresses Regulares e colando-as no seu cdigo toboguas ficam muito desanimados e
sem ter a mnima idia de porque a expresso funciona. Ou se ela indiferentes, entrando em galerias ruins e
funciona! afundando em extremidades polticas. Os
loop do bifes fazem tornozeleiras com as pessoas
print "Entre com sua senha: " e as deixam no bolso das calas dos
senha = gets toboguas, quando as calas esto
if senha.match( /^\w{8,15}$/ )
descompanhadas. Eles fogem da
break
else comunidade dos toboguas atravs de um
puts "** Senha inadequada! Deve ter entre 8 e 15 enorme tobogua feito de sungas de bife.
caracteres!" Ou como eu disse, pessoas com sungas de
end bife.
end
Expresses Regulares so uma mini-linguagem construda dentro do Ruby e muitas outras linguagens de
programao. Eu, na verdade no deveria dizer mini, j que regexps podem ser complicadas e tortuosas e muito mais
difceis que qualquer programa Ruby.
Usar expresses regulares extremamente simples. como o Cervo: fazer fumaa um processo rduo. Mas forar
seus ombros sobre a fumaa e direcionar-se para o Weinerschnitzel para pegar um pretzel de cachoro quente e
mostarda fcil.
irb> "senha_adequada".match( /^\w{8,15}$/ )
=> #<MatchData:0xb7d54218>
irb> "esta_senha_inadequada_muito_longa".match( /^\w{8,15}$/ )
=> nil
O mtodo String#match o uso prtico mais simples das regexps. O mtodo match checa para ver se a string se
adequa as regras dentro da regexp. Uma regexp s til com strings, para testar strings por uma srie de condies. Se
as condies so atendidas, um objeto MatchData retornado. Caso contrrio, voc ter nil.
As expresses regulares mais bsicas so para realizar buscas dentro de strings. Digamos que voc tem um grande
arquivo e quer procurar nele por uma palavra ou frase. J que um tempinho se passou, vamos procurar dentro dos
registros de Achados e Perdidos dos Pr-eventualistas novamente.
require 'preeventualist'
PreEventualist.achadoperdido( 'caminhao' ) do |page|
page.each_line do |linha|
puts linha if linha.match( /caminhao/ )
end
end
Isto no muito diferente do cdigo que usamos anteriormente para linhas com a palavra caminho. Anteriormente
usamos puts linha if linha['caminhao'], o que na verdade um jeito mais simples de se procurar
dentro de uma string, se voc est procurando apenas por uma simples palavra. A regexp /caminhao/ idntica.
Encontre a palavra caminhao. Em qualquer lugar da string.
Hmn, mas e se caminho for maiscula. Caminho. E ento?
puts linha if linha.match( /[Cc][Aa][Mm][Ii][Nh][Aa][Oo]/i )
As classes dos caracteres so as sees cercadas por colchetes. Cada classe de caractere d uma lista de caracteres
que so compatveis para este lugar. (O primeiro lugar compatvel tanto um C maisculo quanto um c minsculo. O
segundo lugar compatvel com um A ou um a. E assim por diante.)
Mas um jeito mais simples de escrever isso assim:
puts line if line.match( /caminhao/i )
A letra i no final da regexp um modificador que indica que a busca no sensvel a caixa. Ela casar com
Caminho. E CAMINHO. E CaMiNho. E outras combinaes de maisculas e minsculas.
Ah, e talvez seu caminho tenha um certo nmero de modelo. Um T-1000. Ou um T-2000. Voc pode se lembrar.
algum T alguma coisa mil.
puts linha if linha.match( /T-\d000/ )
V, linguagem de cervo. O \d representa um digito. uma incgnita na regexp para qualquer tipo de nmero. A
regexp ir agora casar com T-1000, T-2000, e tudo em diante at T-9000.
Classes de Caracteres
\d casa dgitos tambm pode ser escrita como [0-9]
casa caracteres de palavra (letras, nmeros e o tambm pode ser escrita como [A-Za-
\w
travesso) z0-9_]
casa espaos em branco (espaos, tabs, retorno de
\s a.k.a. [\t\r\n]
carro, pula linha)
\D casa tudo menos dgitos um conjunto negado [^\d]
\W casa tudo menos caracteres de palavra assim como [^\w]
\S casa tudo menos espaos em branco tambm [^\s]
. o ponto casa tudo.
Construir uma expresso regular envolve encadear esses receptculos para expressar sua busca. Se estiver procurando
por um nmero seguido de espao em branco: /\d\s/. Se estiver procurando por trs nmeros em seqncia:
/\d\d\d/. As barras que abrem e fecham marcam o incio e o fim da expresso regular.
Uma busca por trs nmeros em seqncia tambm pode ser escrita como: /\d{3}/. Imediatamente aps uma classe
de caracteres como \d, voc pode usar um smbolo de quantidade para dizer quantas vezes quer que aquela classe de
caracteres seja repetida.
Quantificadores
{n} casa exatamente n vezes Precisamente trs nmeros em seqncia /\d{3}/
{n,} casa n vezes ou mais Trs ou mais letras em seqncia /[a-z]{3,}/i
{n,n2 casa pelo menos n vezes mas no Ento, /[\d,]{3,9}/ casa entre trs e nove
} mais que n2 vezes caracteres que so nmeros ou vrgulas
* o asterisco * a forma curta para Para casar dois pontos, seguidos de zero ou mais
{0,} caracteres de palavra: /:\w*/
o sinal de mais a forma curta para Para casar um ou mais sinais de menos ou mais, use /[-
+
{1,} +]+/
a interrogao a forma curta para Para casar trs nmeros seguidos de um ponto opcional:
?
{0,1} /\d{3}[.]?/
Uma expresso regular bem comum uma que case nmeros de telefone. Nmeros de telefone norte-americanos
(incluindo cdigo de rea) podem ser casados usando a classe de caractere de dgito e os quantificadores precisos.
irb> "Ligue 909-375-4434" =~ /\d{3}-\d{3}-\d{4}/
=> 6
irb> "O nmero (909) 375-4434" =~ /[(]\d{3}[)]\s*\d{3}-\d{4}/
=> 11
Desta vez, em vez de usar match para procurar pela expresso, usou-se o operador =~. Este operador o operador
de casamento, um sinal de igual seguido de um til. O til como uma fumacinha saindo da ponta de uma chamin.
Lembre-se dos cervos, a fumaa que eles soltam, uma linguagem crptica assim como as expresses regulares. O til
fumacento aponta para a expresso regular.
O operador de casamento retorna um nmero. O nmero a posio na string onde a expresso regular foi encontrada.
Ento quando o operador retorna 6, ele est dizendo, Antes da expresso, h seis caracteres na string.
Se voc precisa casar a string inteira, voc pode usar a varivel global especial $& se voc est usando o operador de
casamento. Ou, se estiver usando o mtodo match, voc pode conseguir a string inteira convertendo o objeto
MatchData em uma string.
# Usando =~ e $& juntos.
irb> "O nmero (909) 375-4434" =~ /[(]\d{3}[)]\s*\d{3}-\d{4}/
=> 11
irb> $&
=> "(909) 375-4434"
A maioria dos Rubistas prefere a segunda alternativa, uma vez que usa um objeto dentro de uma varivel local em vez
de uma varivel global. Variveis globais so meio questionveis, uma vez que podem ser facilmente sobrescritas. Se
voc rodar duas expresses regulares na seqncia, a varivel global ser sobrescrita na segunda vez. Mas com
variveis locais voc pode manter as duas ocorrncias desde que as variveis tenham nomes diferentes.
Alm de encontrar ocorrncias, outro uso comum de expresses regulares fazer encontre-e-substitua de dentro do
Ruby. Voc pode buscar pela palavra mala e substitui-la pela palavra banjo. Claro, voc pode fazer isso com
strings ou expresses regulares.
irb> musica = "Eu furtei sua mala / E roubei o malabarista"
irb> musica.gsub 'mala', 'viola'
=> "Eu furtei sua viola / E roubei o violabarista"
O mtodo gsub significa substituio global. Note como no primeiro exemplo ele substituiu a palavra mala e as
quatro primeiras letras de malabarista. Strings tambm tm um mtodo simples sub que vai substituir apenas uma
vez.
E assim este captulo acaba, com Blix e os Raposos voando no slido rosa expelido por um cervo muito reservado em
algum lugar naquelas pastagens.
6. S Parando Para Lhe Assegurar Que o Porco-espinho No Se Moveu
Um dia, h algum tempo atrs, quando conheci o Bigelow (o cachorro que fugiu com os
bales), eu voltei para o meu apartamento levando uns jogos de tabuleiro que havia
comprado em uma venda de garagem. E a Quil estava na minha varanda. O que me
surpreendeu, pois ela estava em San Antonio h trs meses. Ela estava dormindo num
saco de dormir na minha varanda.
No tinha grana para a escola de artes, ento ficou na minha casa por uns cinco meses.
Eu achei essa bicama usada para o nosso cantinho. noite, ns nos sentvamos em
nossas camas para ler um para o outro estrias de nossas agendas. Eu estava escrevendo
um livro sobre uma criana que era um detetive e tentava descobrir quem matou essa
outra criana do time de tnis e todos esses animais acabavam ajudando ela a desvendar
o caso. Ela escrevia um livro sobre um garoto que coloca um anncio nos classificados
para que outras crianas entrem no seu culto fictcio e eles terminam por construir um
foguete. Mas durante a maioria do livro dela essas crianas esto perdidas na mata,
totalmente sem rumo, o que eu me enchi de escutar a cada noite.
, toda noite era poesia ou estrias ou idias para pregar peas nos vizinhos. Nosso vizinho Justin era um grande f do
jogo de tabuleiro Warhammer. Ele tinha todas essas espadas e tnicas de verdade. Decidimos fazer armaduras de papel
alumnio e atacar o apartamento dele. Comeamos a pilhar o apartamento e ele adorou. Da ele tambm fez sua
armadura de papel alumnio e ns fomos a um glamuroso estdio profissional e tiramos uma foto em grupo de
qualidade.