Você está na página 1de 121

1.

Sobre este Livro


2.

Konnichi wa, Ruby

1. Abrindo Este Livro


Finja que voc abriu esse livro (embora voc provavelmente j tenha aberto esse livro), e encontrou uma enorme
cebola bem no meio da dobra do livro. (Eu pedi ao fabricante do livro que inclusse a cebola.)
Logo voc pensa, Wow, esse livro vem com uma cebola! (Mesmo que voc no tenha um apreo particular por
cebolas, eu tenho certeza que voc consegue apreciar a logstica de se enviar qualquer vegetal discretamente dentro de
um suposto manual de programao.)
Ento voc se pergunta: "Espera um pouco. Eu pensei que isso fosse um livro sobre Ruby, a incrvel nova linguagem
de programao do Japo. E embora eu consiga apreciar a logstica de se enviar qualquer vegetal discretamente dentro
de um suposto manual de programao, por que uma cebola? O que eu devo fazer com ela?
No. Por favor no pense sobre isso. Voc no precisa fazer nada com a cebola. Deixe a cebola de lado e deixe ela
fazer algo com voc.
Eu vou ser direto com voc. Eu quero chorar. Lamentar. Me lamuriar docemente. Este livro um guia comovente de
Ruby. Isso significa cdigo to lindo que lgrimas sero derramadas. Isso significa contos nobres e verdades
melanclicas que vo fazer voc acordar na manh seguinte nos braos desse livro. Abraando-o forte por todo o dia.
Se necessrio, improvise uma bolsa para o (Comovente) Guia de Ruby do Why, assim voc poder ter sempre a tenra
companhia deste livro.
Voc deve soluar pelo menos uma vez. Ou no mnimo suspirar. Se no der certo, a cebola vai fazer tudo isso
acontecer para voc.
2. A Histria do Cachorro O que eu vou fazer com os
Vamos ver se a histria a seguir comove voc: lucros massivos deste Livro
Um dia eu estava caminhando numa dessas ruas movimentadas Qualquer um que j tenha escrito um livro pode
cheias de revendas de carros (isso foi logo aps meu casamento ter lhe dizer como fcil para um autor se distrair
sido cancelado) e achei um cachorro rfo na rua. Um cachorro com delrios de grandeza. Na minha experincia,
preto, peludo, com olhos verde-avermelhados. Eu meio que me eu paro duas vezes em cada pargrafo, e quatro
senti rfo tambm, ento eu peguei alguns bales que estavam vezes em cada tirinha, s para antever a riqueza
amarrados a um poste em uma revenda e amarrei eles na coleira do e prosperidade que este livro vai propiciar ao
cachorro. Eu decidi, ento, que ele seria meu cachorro. Eu dei a ele meu estilo de vida. Eu temo que a confeco
o nome de Bigelow. deste livro possa parar completamente para dar
Ns fomos comprar alguns Biscrocks para o Bigelow e, depois, espao ao exrcito de utilitrios e carros de luxo
seguimos para minha casa, onde ns poderamos sentar em que esto passando pela minha cabea.
cadeiras reclinveis e ouvir Zygotic Mynci de Gorky. Oh, e ns Em vez de parar meu trabalho neste
tambm tivemos que parar em um bazar para comprar uma cadeira (comovente) Guia, eu reservei este espao como
reclinvel para o Bigelow. uma zona de segurana para despejar meus
Mas Bigelow no tinha me aceitado como seu mestre. Ento, cinco vazios e inteis desejos.
minutos depois, aquele cachorro estpido mudou de calada e eu o Hoje eu estava nesse restaurante italiano,
perdi. Logo, considerando que ele j esteve perdido uma vez, com Granados, e estava pagando a conta. Aconteceu
essa eram duas. Eu diminu o passo em direo a uma vida de de eu notar que uma garrafa de vinagre
Biscrocks e uma cadeira reclinvel extra. Eu tive um cachorro por balsmico estava saindo por $150. Bem
cinco minutos. pequena. Eu podia escond-la na minha mo.
Estpido cachorro traidor. Eu me sentei num banco e joguei pinhas Envelhecida vinte e dois anos.
em uma esttua de trs ovelhas atravessando uma ponte. Depois Eu gastei muito tempo pensando naquela
disso, eu chorei por horas. As lgrimas simplesmente vieram. garrafa. s vezes ela um acessrio em
Agora existe algo comovente para comear. algumas dessas fantasias obsessivas. Em uma
Eu fico imaginando aonde ele foi parar com todos aqueles bales. fantasia, eu entro no restaurante, jogo uma pilha
Aquele cachorro maluco parecia uma festa com patas. de vegetais sobre o balco e digo seriamente ao
caixa: Rpido! Eu tenho uma salada importante
No foi muito depois que eu fiz meu prprio Bigelow. Eu imprimi para fazer!
um bando de pginas sobre Ruby. Artigos achados na Web. Eu dei
uma olhada neles no trem indo para casa um dia. Folheei elas por Em outra fantasia relacionada, eu estou jogando
cinco minutos e desisti. No me impressionou. alface fora. Tamanha brutalidade no vai se
beneficiar do meu novo vinagre. No, eu vou
Eu sentei, olhando para o mundo atravs da janela, um chegar ao ponto onde a fama e a aristocracia vo
liquidificador gigante misturando grafite e ferro derretido bem na me corromper completamente. Meu novo alface
minha frente. Este mundo muito grande para uma linguagem to ser dinheiro. Frio, duro dinheiro, Sra. Price.
pequena, pensei. A pobrezinha no tem chance. No tem pernas
para se sustentar. No tem braos para nadar. Logo, eu estarei gastando centenas por um bloco
de queijo grego Mizithra.
L estava eu. Um pequeno homem em um frgil e pequeno trem (e
eu ainda tinha um dente-de-leite naquela poca) em meio a bilhes Minha imaginao agora foi alm das posses.
de pessoas vivendo numa bola azul flutuante. Como eu posso Certamente, eu pensei sobre a minha aquisio
enfrentar Ruby? Quem me garante que eu no vou morrer de urnas gregas, carreatas, linhas areas,
engasgado com meu celular mais tarde naquela mesma noite? Why pirmides, ossos de dinossauro. Ocasionalmente
est morto, Ruby ainda vive. eu verei cidades devastadas no noticirio e vou
anotar na minha lista de compras: Furaco.
A lpide:
Entretanto, agora eu vejo um objetivo maior.
O que isso na traquia dele? Colocando de forma simples: e se eu
Oh, olha, um Nokia! acumulasse uma fortuna to grande que a casa
da moeda no conseguisse imprimir o suficiente
s a minha sorte. Finalmente vou ter um gostoso e duradouro para atender a minha demanda? Ento, todo
cochilo embaixo da terra, s para ser constantemente incomodado mundo seria obrigado a usar dinheiro do Banco
pela Cnone de Pachelbel tocando incessantemente no meu Imobilirio como moeda. E voc teria que
estmago. ganhar no Banco Imobilirio para colocar
comida na mesa. Estes seriam jogos de extrema
tenso. Quero dizer, voc faz uma hipoteca na
Av. Botafogo e as crianas comeam a chorar.
3. Nasce o Sol Vermelho Alm disso, eu acho que voc ver o incio do
fim daqueles que usam a regra de
Ento, agora voc est se perguntando porque eu mudei de idia Estacionamento Grtis como os cofres
em relao ao Ruby. A resposta rpida : rolou qumica. subterrneos para os recursos da cidade.
Como quando voc encontra Algum na faculdade e ela parece Apesar disso, voc tem que dar algum valor ao
com algum que costumava bater na sua cara com um pincel dinheiro falso. Dinheiro falso detona. Voc pode
quando voc era criana. E ento, impulsivamente, voc conclui colocar suas mos nele muito rpido. Em um
que esse novo algum provavelmente hostil. Voc faz careta momento, parece que voc podre de rico.
quando v o cabelo dessa pessoa. Voc desliga o telefone Quando eu era criana, eu me juntei com
bruscamente nos momentos cruciais das piadas dela. Voc resolve algumas crianas da vizinhana e ns
usar seu pula-pula bem onde ela est querendo caminhar! construmos uma pequena Tijuana na nossa rua.
Seis meses depois, de alguma forma, voc e esse Algum esto Ns fizemos nossos prprios pesos, vestimos
sentados a beira de uma fonte tendo uma conversa perfeitamente sombreiros e tudo mais!
normal. A face dela no lembra mais seu nmeses infantil. Voc Um garoto estava vendendo pamonhas quentes
conheceu o gmeo bom. Rolou qumica. por dois pesos cada. Dois pesos! Esse garoto
Logo, apesar de que eu provavelmente devesse estar martelando sabia que o dinheiro era falso? Ele era louco?
seus dentes com todo o hype sobre Ruby e todos os acrnimos Quem convidou esse garoto? Ele no sabia que
minuciosamente preparados que a acompanham para todo lugar isso aqui no era Tijuana de verdade? Talvez ele
(afiando as gargantas dos seus chefes e dos chefes do seus chefes), fosse de Tijuana! Talvez estes fossem pesos de
em vez disso eu vou te deixar velejar. Vou deixar voc mergulhar verdade! Vamos fazer mais pesos de verdade!
no cdigo, me intrometendo ocasionalmente com minhas prprias Eu acho que ns at tnhamos uma taberna onde
experincias. Vai ser bem fcil, bem natural. voc podia ficar completamente bbado de Ki-
Eu devia, entretanto, te oferecer alguma espcie de motivao. Suco. Nada como crianas correndo por a,
Ento, cara plida, eu vou lhe dar minhas trs melhores razes para resmungando incoerncias com os lbios
aprender Ruby e te deixar em paz. vermelhos como os de um palha

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.

4. Como Livros Comeam


Olha, se voc algum dia j leu um livro, voc sabe que nenhum livro pode comear direito sem uma quantidade
exorbitante de sinergia. Sim, sinergia. Talvez voc no soubesse disso. Sinergia quer dizer que eu e voc devemos
cooperar para fazer desta leitura uma tima experincia.
Comeamos o livro nos dando bem na Introduo. Este companheirismo, esta sinergia, nos impulsiona pelo livro,
comigo guiando voc em seu caminho. Acene com a cabea ou d uma risadinha para indicar o seu progresso.
Eu sou Peter Pan segurando a sua mo. Vamos, Wendy! Segunda estrela direita e em frente at o amanhecer.
Um problema aqui. Eu no me dou bem com gente. Eu no seguro mos muito bem.
Qualquer um da minha equipe vai lhe dizer. Nas Cerimnias de Abertura Deste Livro (um evento com Buffet e
arquibancadas), eu descobri que os sanduches de pepino no eram servidos em guardanapos de tecido. Como
resultado, a manteiga no se ajustou aos pepinos direito De qualquer forma, Eu fiz uma grande cena e ateei fogo a
alguns caminhes de propaganda do lado de fora. Eu deixei um holofote em pedaos, e coisas do tipo. Eu dava risadas
manacas extremamente altas at o final daquela noite. Foi uma baguna e tanto.
Entretanto, j que eu no me dou bem com gente. Eu no convidei ningum alm de mim para as Cerimnias de
Abertura Deste Livro. Ento no foi to embaraoso assim. Eu mantive o caso sob panos quentes e ningum jamais
ficou sabendo do que aconteceu.
Ento voc tem que saber que sinergia no significa exatamente sinergia nesse livro. Eu no posso com a sinergia
normal. No, neste livro, sinergia significa raposas em quadrinhos. O que eu quero dizer : este livro vai comear
com uma quantidade exorbitante de raposas em quadrinhos.
E eu vou contar com voc para transform-las em sinergia.

3.

Um Rpido (e indolor, eu espero) passeio atravs do


Ruby (com quadrinhos da raposa)
Isso, essas so as duas. Minha asma est atacada, preciso dar uma respirada num ar medicinal agora. J volto.

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.

1. Linguagem e EU QUERO DIZER Linguagem

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

2. As Partes da Conversa A respeito do uso comercial do


Assim como a faixa branca nas costas do gamb e a branca e (Comovente) Guia
enrolada grinalda da noiva, vrias partes da conversa tm
Este livro foi lanado sob a licena Creative
sinalizaes visuais para te ajudar a identific-las. Pontuao,
Commons que permite uso comercial ilimitado
maisculas e minsculas, iro ajudar seu crebro ver pedaos de
deste texto. Basicamente, isto significa que voc
cdigo e reconhec-los intensamente. Sua mente vai gritar
pode vender todas cpias piratas do meu livro e
freqentemente Hey, Eu conheo aquele cara! Voc tambm
ficar com todo o lucro para voc. Eu confio nos
poder contar vantagem em conversas com outros Rubistas.
meus leitores (e no mundo ao redor deles) para
Tente se focar na aparncia de cada uma destas partes da me passar para trs. E colocar uma edio em
conversa. O resto do livro vai entrar em detalhes. Eu darei Xerox com aquela figura das mos unidas
pequenas descries de cada parte da conversa, mas voc no rezando, que ns conhecemos, na capa.
precisa entender a explicao. Ao trmino deste captulo, voc
Caras, processar os outros no vale a pena,
deve estar apto a reconhecer cada parte de um programa Ruby.
muita dor de cabea. Ento eu simplesmente vou
apoiar a pirataria aqui. Qualquer um que quiser
Variveis ler este livro deveria poder faz-lo. Qualquer um
Qualquer palavra simples, em minsculas, uma varivel no que queira comercializar o livro ou criar edies
Ruby. Variveis podem ser compostas por letras, dgitos e especiais, eu fico lisonjeado.
travesses. Porque eu iria querer o $$$? IGNORE TODAS
x, y, banana2 ou telefone_para_codorna AS OUTRAS BARRAS LATERAIS: Eu perdi a
vontade de ser um ricao preguioso. Soa um
so exemplos. pouco desumano, mas eu gosto da minha
televiso preto-e-branco. E adoro minha
Variveis so como apelidos. Lembra quando todo mundo te luminria florida. Eu no quero uma carreira de
chamava de Pete Fedido? As pessoas diziam: Vem aqui, Pete escritor. Dinheiro no vai me inspirar. No faz
Fedido! E todo mundo milagrosamente sabia que voc era o Pete sentido.
Fedido. Ento, se dinheiro no significa nada ao cara
Com variveis, voc d um apelido a algo que voc use sortudo (the lucky stiff), para que me enganar
freqentemente. Por exemplo, vamos dizer que voc tem um quando voc pode optar por prticas comerciais
orfanato. um orfanato malfico. E quando o Papai Warbucks exclusas para literalmente esmagar minha psique
vem comprar mais crianas, ns insistimos que ele nos pague e me deixar chorando com meu pulmo negro?
cento e vinte um reais e oito centavos pelo ursinho de pelcia da Oh, e a ironia de usar meu trabalho contra mim!
criana, o qual ela ficou apegada nos momentos sombrios que Morra, garoto comovido!
passou vivendo neste pesadelo de custdia. Para lhe dar uma idia do que quero dizer, aqui
taxa_de_urso_de_pelucia = 121.08 esto alguns conceitos dissimulados que
poderiam seriamente matar minha fora de
Mais tarde, quando voc pegar ele no caixa (uma registradora vontade de me forar a reconsiderar algumas
turbinada que roda Ruby!), voc vai precisar juntar as somas em coisas, como a existncia.
um total. IDIA UM: TABACARIA GIGANTE
total = taxa_de_orfao + Compre uma companhia de cigarros. Use meus
taxa_de_urso_de_pelucia + gorjeta cartuns dos raposos para abastecer uma agressiva
campanha publicitria. Aqui est um anncio para
Estes apelidos para variveis vm a calhar. E no submundo comear:
sedento das vendas infantis, qualquer ajuda bem-vinda, tenho
certeza.

Deixe bvio que seu pblico alvo so crianas e


asmticos. Ento, logo que voc tiver tudo
pronto, faa com que as pessoas da verdade
Nmeros faam um dossi sobre mim e minha fazenda de
raposas de tinta.
O tipo mais bsico de nmero um integer (nmero inteiro), uma
srie de dgitos que podem comear com um sinal de menos ou
de mais. Moderninho sensvel apoiado na
1, 23 e -10000 so exemplos. borda da selva urbana: Ele se
intitula o cara sortudo.
Vrgulas no so permitidas em nmeros, mas travesses sim.
Ento se voc acha melhor marcar os milhares para que o nmero
fique mais legvel, use um travesso.
(Puxa as cortinas para revelar um
habitantes = corpo cinza em uma maca.)

12_000_000_000

Nmeros decimais so chamados de floats (nmeros reais ou Moderninho: Alguns caras no so


ponto flutuante) no Ruby. Nmeros reais consistem em nmeros to sortudos assim.
com casas decimais ou em notao cientfica.
3.14, -808.08 e 12.043e-04 so exemplos.

(Som errtico. Raposos em


Strings (Conjunto de Caracteres) quadrinhos sobrepostos para gerar
uma viagem subliminar mental Willy
Strings so quaisquer tipos de caracteres (letras, dgitos,
Wonka.)
pontuao) cercados por aspas. Aspas, simples ou duplas, so
usadas para se criar strings.
Yo. Por que voc tem esses Big Smokies assim,
"laboratoriodomar", '2021' ou "Estes Holmes?
quadrinhos so hilrios!" so exemplos.
IDIA DOIS: HEY, PELOTO DE
FUZILAMENTO
Quando voc cerca caracteres em aspas, eles ficam guardados
juntos como uma string s. Como eu disse, comecem a vender cpias do meu
livro, mas corrompam o texto. Estas cpias
Pense num reprter que est anotando as baboseiras de uma
alteradas conteriam numerosas referncias
celebridade incoerente. Eu estou muito mais sbia, disse Avril
grosseiras (e difamatrias) s agncias do
Lavigne. Agora eu sei como as coisas so o que voc tem que
governo, como o exrcito americano e o
fazer e como trabalhar isso.
pentgono. Voc me faria com que eu parecesse
frase_da_avril = "Eu estou muito mais sbia. um completo traidor. Como se eu tivesse todos
Agora eu sei esses planos para, voc sabe, matar certos
como as coisas so -- o que voc tem
que fazer e como trabalhar isso." membros menos desejveis do exrcito ou do
Pentgono.
Ento, assim como ns guardamos um nmero na varivel No que existam membros menos desejveis no
taxa_de_urso_de_pelucia, agora ns estamos guardando uma exrcito ou no Pentgono. , no era isso que eu
coleo de caracteres (uma string) na varivel frase_da_avril. O queria dizer.
reprter envia esta frase para impresso, que por acaso usa Ruby
Oh, merda.
para operar as impressoras.
<setup> Oh, merda. Oh, merda. Oh, merda.
frase_da_oprah = "O" Apague as luzes. Abaixe-se.
frase_da_avril = "A"
debate_ashlee_simpson = "D" IDIA TRS: ANNCIOS, PARTE II
</setup>
print frase_da_oprah Que tal fazer graa dos asmticos diretamente??
print frase_da_avril
print debate_ashlee_simpson

IDIA QUATRO: ALEC BALDWIN


Faa uma adaptao do livro para o cinema. E j
Symbols (Smbolos) que eu, voc sabe, sou um personagem no livro
voc poderia conseguir algum como Alec
Smbolos so palavras que parecem variveis. Novamente, elas Baldwin para me interpretar. Algum que esteja
podem conter letras, dgitos e travesses. Mas elas comeam com num perodo muito ruim na carreira.
dois pontos.
Voc podia fazer como se eu usasse toneladas de
:a, :b, ou :ponce_de_leon so exemplos. drogas. Como se trabalhar comigo fosse algo
insano. Como se eu ficasse demitindo pessoas e
Smbolos so strings leves. Geralmente, smbolos so usados em trancando elas na sala da scooter e obrigando-as a
situaes em que voc precisa de uma string mas no vai vestir roupas feitas de po. Isso, como se eu
imprimi-la na tela. pudesse realmente assar as pessoas nas roupas.
Voc pode dizer que um smbolo pouco mais digervel para o Voc podia dizer que eu tenho uma forma gigante
computador. como um anti-cido. Os dois pontos indicam as e que eu prendo as pessoas dentro. Ento, eu
bolhas saindo do estmago do seu computador enquanto ele derramo toda massa e de fato asso eles at o po
digere o smbolo. Ah. Doce, doce alvio. crescer e eles estarem quase mortos. E quando o
pessoal da televiso vier e eu aparecer no Bom
Dia Brasil, eles vo perguntar, Ento, quantas
pessoas voc empregou na produo do seu
livro? E eu responderia, Uma dzia de
padeiros! e eclodiria em gargalhadas manacas
to altas que forariam a audincia a tapar os
ouvidos.
claro que, no curso da minha insanidade, eu
declararia guerra ao mundo. E daria uma briga
boa com as pessoas de po. At que o exrcito
americano (ou o Pentgono) construsse um
crebro de macaco robtico gigante (interpretado
por Burt Lancaster) para me perseguir.
Aqui voc vai me fazer parecer completamente
idiota. Eu no sacrificarei apenas todas as pessoas
po (os Starchtroopers, cavaleiros do amido) para
me salvar, no apenas me renderei covardemente
ao grande crebro de macaco, mas quando eu
escapar por um triz, eu vou gritar para a platia.
Constantes Gritando incessantemente que aquele MEU
filme e que ningum deveria mais assisti-lo, eu
Constantes so palavras como variveis, mas constantes so rasgarei a tela ao meio e o projetor vai rodar seus
maisculas. Se variveis so os substantivos do Ruby, ento rolos em vo. E este ser o final do filme. As
pense nas constantes como substantivos prprios. pessoas ficaro to irritadas.
Time, Array ou Bunny_Lake_Desapareceu Fiquei pensando aqui. De fato Alec Baldwin fez
so exemplos. um trabalho decente de dublagem em Os
Excntricos Tenembaums. A carreira dele deve
Em ingls, substantivos prprios tm a primeira letra maiscula. estar indo bem. Voc pode no querer us-lo. Ele
O Edifcio Empire State. Voc no pode simplesmente mudar o pode no aceitar.
Edifcio Empire State. Voc no pode simplesmente decidir que o
Edifcio Empire State outra coisa. Substantivos prprios so Faamos o seguinte. Eu interpreto esse papel. Eu
assim. Eles se referem a algo muito especfico e que usualmente tenho uma carreira de papis ruins.
no muda com o tempo.
Do mesmo modo, constantes no podem ser alteradas depois de
criadas.

EdificioEmpireState = "350 5th


Avenue, NYC, NY"

Se tentarmos mudar a constante, Ruby vai reclamar com a gente.


Coisas assim desagradam ele.
Mtodos
Se variveis e constantes so substantivos, ento mtodos so verbos. Mtodos geralmente esto ligados ao final das
variveis e constantes por um ponto. Voc j viu mtodos trabalhando.
porta_da_frente.abra

Acima, abra o mtodo. Nesta ao, o verbo. Em alguns casos, voc ver aes ligadas juntas.
porta_da_frente.abra.feche

Instrumos o computador a abrir a porta da frente e depois imediatamente fech-la.


porta_da_frente.esta_aberta?

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.


Pense nisso como um tubo interno que o mtodo carrega, contendo suas instrues extras. Os parnteses formam as
redondas e molhadas paredes do tubo. As vrgulas so os ps de cada argumento, saindo para fora da beirada. O ltimo
argumento tem o p preso embaixo ento eles no aparecem.
Como um barco de bias, mtodos com argumentos podem ser ligados.
porta_da_frente.pintar( 3, :vermelho ).secar( 30 ).fechar()

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.

Argumentos de bloco so usados no incio do bloco.


{ |x,y| x + y }

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.

('a'..'z') um range, representando o alfabeto em minsculas.

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.

Arrays (Conjuntos, Vetores)


Um array uma lista cercada por colchetes e separada por vrgulas.
[1, 2, 3] um array de nmeros.

['casaco', 'luvas', 'snowboard'] um array de strings.

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.

3. Se Eu J No Tivesse Lhe Tratado Sete momentos Zen da minha


Suficientemente Como Uma Criana vida
Estou orgulhoso de voc. Qualquer um ir lhe contar o tanto que 1. 8 anos de idade. Apenas deitado na cama,
me orgulho de voc. Como eu continuo e continuo a falar sobre pensando. E eu percebo. No h nada
essa tima pessoa annima a fora que rola e l e rola e l. Estas que me impea de me tornar um
crianas, Eu lhes conto. Cara, estas crianas tem corao. Eu odontopediatra.
nunca E eu mal consigo terminar uma frase porque estou 2. 21. Achei um lpis na praia. Gravado nele
absolutamente mergulhado em lgrimas. estava: Eu estimo a serenidade. Enfiei ele
no bolso do meu palet. Assisti as ondas
E meu corao irradia um vermelho intenso sob minha pele
indo e voltando.
translcida e eles tiveram que me administrar 10 mililitros de
3. 22. Encontrei um besouro no meu
Javascript para me fazer voltar. (Eu respondo bem a toxinas no
banheiro que estava prestes a cair na sada
sangue.) Cara, esse negcio vai chutar para longe das suas guelras!
do aquecedor. Adotei sua causa. Fiz uma
Bem, sim. Voc est indo bem. Mas agora eu devo comear a ser pequena mochila com uma folha e linha.
um bruto professor secundrio. Preciso comear a ver boas notas Dentro da mochila: uma estaca e uma
suas. At agora, voc no fez nada mais do que olhar para cima e pilha palito. Isto deve ser suficiente para
para baixo. Ok, claro, voc fez excepcionais leituras em voz alta ele. Libertei-o pelo porto da frente.
anteriormente. Agora ns precisamos de habilidade de 4. Trs anos de idade. Puxei a cortina para o
compreenso aqui, Smotchkkiss. lado. Luz do sol.
Diga em voz alta cada parte do discurso usada abaixo. 5. 14. Andando de bicicleta no per com
meu treinador correndo logo atrs de mim
5.times { print "Odelay!" } enquanto o sol se pe logo depois que eu
nocauteei Piston Honda na verso original
Voc pode querer at mesmo cobrir este pargrafo enquanto l, para Nintendo do Punch-Out com Mike
porque seus olhos podem esquivar-se para olhar a resposta. Ns Tyson.
temos um nmero 5, seguido por um mtodo .times. Depois, a 6. 11. Doente. Assistindo Heathcliff na
primeira garra de caranguejo de um bloco. O mtodo do kernel televiso. Por horas, era s Heathcliff. E
print no tem ponto e seguido por uma string "Odelay!". A ele era capaz de vir bem perto do meu
garra de caranguejo final fecha nosso bloco. rosto. A cabea dele crescia em minha
direo. Seu rosto pulsava, bem perto, e
Diga em voz alta cada parte do discurso usada abaixo.
depois milhes de milhas distante. O som
exit unless "restaurante".include? havia sumido. Em fraes de segundo,
"aura" Heathcliff preencheu o universo, ento se
foi para o fim da eternidade. Eu ouvi a
Assim como o mtodo print, exit um mtodo do kernel. Se voz da minha me tentando falar mais
voc prestou ateno na grande lista de palavras reservadas, voc alto que o desenho. Heathperto,
saber que unless uma dessas palavras reservadas. A string Heathlonge, Heathperto, Heathlonge. Era
"restaurante" um delrio religioso com um gato, um
est unida ao mtodo include?. E no final, a string "aura". estroboscpio e o grave abafado da voz
Diga em voz alta cada parte do discurso usada abaixo. da minha me. (Eu tive 40,5 de febre
naquele dia.)
['torrada', 'queijo', 'vinho'].each { |alimento| 7. 18. Comprei um gigapet. Um pato.
print( alimento.capitalize ) }
Alimentei-o por um tempo. Dei banho
nele. Esqueci dele por quase dois meses.
Esta centopia partilha finas iguarias. Um array inicia o exemplo. Um dia, enquanto fazia uma limpeza,
No array, trs strings 'torrada', 'queijo' e 'vinho'. encontrei uma corrente e no final dela ele
Todo o array seguido por um mtodo each. estava. Ei, patinho. Doido, saltitando
Dentro de um bloco, o argumento do bloco alimento, descendo com sua cabeleira, gritando linhas
seu tobo-gua dentro do bloco. O mtodo capitalize ento diagonais. Vestindo um smoking.
passa para maiscula a primeira letra do argumento do bloco, a
qual inicia a varivel alimento. Esta string com a inicial em
maiscula passada para o mtodo print do kernel.
Olhe para os exemplos mais uma vez. Tenha certeza de que voc
reconhece todas as partes do discurso usadas. Elas so bem
distintas, no? Respire profundamente, aperte firmemente suas
tmporas. Pronto, agora vamos dissecar cdigo to valioso quanto
um olho de vaca.

4. Um Exemplo Para Te Ajudar a Crescer

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 )

Voc v isso dentro do:


http.get( '/en/LICENSE.txt' )

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

E neste pedao de cdigo:


print( http.get( '/en/LICENSE.txt' ).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.

5. E Ento, A Rpida Viagem Chega a Uma Calma, Amortecida Parada

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.

E voc sabe (voc tem que saber!) que isso


vai virar uma obsesso. Primeiro, voc se
esquecer completamente de levar o
cachorro para passear. Ele vai estar na
portinhola, balanando a cabea, enquanto
seus olhos devoram o cdigo, enquanto
seus dedos transmitem mensagens ao
computador.
Graas sua negligncia, as coisas vo
comear a quebrar. Seu amontoado de folhas de cdigo impressas cobrir as entradas de ar. Sua fornalha se engasgar.
O lixo ir se amontoar: caixas de comida delivery que voc apressadamente pediu, correspondncia intil que voc
no se preocupou em jogar fora. Sua prpria imundice poluir o ar. Limo infestar o forro, a gua ir endurecer,
animais se convidaro para entrar, rvores viro pelas fundaes.
Mas seu computador ser bem tratado. E voc, Smotchkkiss, o ter nutrido com o seu conhecimento. Nas eras que
voc ter passado com sua mquina, voc se tornar parte-CPU. E ela se tornar parte-carne. Seus braos iro de
encontro s portas dela. Seus olhos aceitaro o vdeo direto pelo conector DVI-24. Seus pulmes ficaro sentados em
cima do processador, esfriando ela.
E ento, na hora que o quarto est prestes a se fechar em torno de voc, como se todo o crescimento engolisse voc e
sua mquina, terminar seu script. Voc e a mquina juntos rodaro este recm criado script Ruby, o produto da sua
obsesso. E o script disparar serras-eltricas para cortar as rvores, coraes para aquecer e regular a casa. Nanorobs
construtores sairo do seu script, reconstruindo seus aposentos, bricolando, renovando, colorindo, polindo,
desinfetando. Poderosos andrides foraro sua decadente casa em uma firme, rgida arquitetura. Grandes pilares
emergiro, esttuas esculpidas. Voc ter domnio sob este estado palacial e as montanhas e ilhas adjacentes sua
fortaleza.
Bom, ento eu acho que voc vai ficar bem. Qu se me diz? Vamos comear esse seu script?\
4.

Pequenas Folhas de Cdigo Flutuando


Tirinha: No fundo, do muito escuro e vil corao de Wyvrnn, passava o rio Selis, mascarando as cortes dos Grifos de
Mal Abochny, sobre faixas de florestas selvagens, saturadas com os corpos de gigantes derrubados no 6o apocalipse,
escavados e enterrados por unicrnios com chifres-brocas (e do vazio destes corpos nasciam mais unicrnios,
preeenchendo as frgeis extremidades e forando os gigantes sem vida a andar!), l embaixo, embaixo da vegetao
coberta por musgo, embaixo da verdadeira terra, no real, real, real (voc sente o real? Em caso afirmativo, gostaria de
saber), cavernas secretas em operao, pedras vetrificadas, 1400 ps quadrados com armrios apertados, valorizados
para o movimento, as cavernas de Ambrose, tudo na companhia de O gnomo com um presunto de estimao!
Eu tenho um monte de animais legal!
todos os seus aniamis de estimao acabaram de partir em um nibus!

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.

1. A Folha como um Smbolo de Status na Ambrose


Tudo certo, Gnomo. D-nos um rpido resumo dos problemas financeiros que voc enfrentou l no seu reino.

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?

Agora Voc ir Escutar a Declarao da Animal Os Comedores de Cachecis


Perfeito Porque Isto Um Livro E Ns Temos Tempo
Eu odeio me intrometer no seu aprendizado,
e Nenhuma Pressa, Certo? mas eu j fiz isso tanto que eu no me importo
H muito tempo atrs, muito, muito antes das lanchas motorizadas mais. Posso mostrar meu prximo projeto para
eu possua uma gua de corrida premiada que levou um tropeo na voc?
pista. Ela capotou dez vezes e bateu num cara que carregava um Eu prometi escrever outro livro. (Trombones.) A
vidro cheio de maionese. Ns tnhamos sangue e maionese para boa notcia que na realidade eu no vou
tudo quanto lado da pista. Desnecessrio dizer, ela era um escrever nada. Voc no vai ter que agentar
desastre. ainda mais essas tolices idiotas.
O veterinrio deu uma olhada e jurou que ela nunca voltaria a Est tudo acabado entre eu e as palavras. Eu
andar. Tinha perdido as pernas e o veterinrio no permitiria que adoraria ficar e explorar cada uma, uma aps a
uma gua sem pernas ficasse apenas sentada por a. Ns precisamos outra, mas est tudo ficando muito previsvel,
abat-la. Ele jurou por sua vida e por sua carreira nisto, insistindo voc no acha? Eventualmente, elas todas sero
que nos dividssemos em duas linhas paralelas. As pessoas que no usadas e eu terei de inventar palavras falsas e
podiam refutar as afirmaes do mdico de um lado; aqueles muito isso seria muito bizelegarro.
cabea-duras para aceitar seu raciocnio mdico infalvel do outro.
O Gnomo, seu animal de estimao de presunto e eu ramos os Agora. Ainda no nada certo, mas j estou em
nicos nesta segunda linha. negociaes com a Anna Quindlen para
escrever no meu lugar. Ns estamos juntando
Ento enquanto os outros empilhavam trofus e guirlandas de flores esforos em um livro que vai arrancar o
em volta da gua, despedindo-se com carinho antes que a bala (Comovente) Guia das suas mos.
viesse e a levasse para casa, o Gnomo e eu freneticamente Simplificando, o Guia ser intil. Voc no ser
vasculhamos a Internet por respostas. Ns lidamos com isso com capaz de equilibrar nenhuma Rom em cima da
nossas prprias mos, cauterizando as feridas em sua perna com coisa.
camares de gua doce vivos. E funcionou bem! Ns tnhamos uma
gua de novo. Ou pelo menos: um corpo de gua com um Esse novo livro. Os Comedores de Cachecis.
abdominal de crustceos congelantes. um romance maduro. Mas tambm um guia
para iniciantes de Macromedia Flash. como se
Ela correu para todo lado depois disso e viveu por anos em Judy Blume encontrasse Praystation. Ou como
cavernas midas no subsolo. 0sil8 estrelando Hillary Duff.
A Animal Perfeito agora o futuro do melhoramento de animais. Eu no quero entregar nada sobre a histria,
Eles criam novos animais e salvam animais velhos por partes. mas para provocar o seu apetite eu posso dizer
claro, levou um longo tempo para isso. Quando o Animal Perfeito isso: um garoto fala com o seu irmo morto em
comeou, voc via um urso crescido adentrar o Animal Perfeito e ActionScript. Mais por vir.
via um urso crescido de culos de sol sair. Completamente cafona.
Fique por a e voc ver um caranguejo com sua prpria mochila
foguete Esse um novo modelo caranguejet 2004.
Mas agora, a operao est a todo vapor. E a limpeza do lugar
impressionante. Todo o equipamento to brilhoso. Tudo
cromado. Ah, e toda a equipe tem armas escondidas. Eles so
treinados para matar qualquer um que entre sem ser anunciado. Ou,
se eles ficarem sem balas, eles so treinados para acertar com as
armas qualquer um que entre sem ser anunciado.
Gnomo, me faa uma macacoestrela.
Um pouco de Ruby imaginrio para voc:
tubo.pegue_uma_estrela

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.

2. Pequeno e Quase Sem Valor

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)

O gato Blix Negociador. Congelado no vazio. Rgido e refinado bigode.


Serenos olhos de lago. Rabo de morno sincelo. Patrocinado por um Boto de
Pausa Bastante Poderoso.
A escurido que circunda o Blix pode ser chamada de espao negativo.
Atente-se nessa frase. Deixe ela sugerir que o vazio tem conotao negativa.
De um jeito similar, nil tem uma nota levemente amarga que ele assobia.
Generalizando, tudo no Ruby tem uma carga positiva. Esta fagulha corre
por strings, nmeros, regexps (expresses regulares), todos eles. Somente
duas palavras reservadas vestem uma capa sombria: nil e false nos
trazendo para baixo.
Voc pode testar essa carga com a palavra chave if (se). Ela se parece
muito com o o bloco do que vimos no ltimo captulo, no qual ambas
terminam com um end.
if copo_plastico
print "O copo de plstico est transbordando!"
end

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

E mais uma manha: empilhar o if e unless.


print "Estamos usando copos de plstico pois no temos de vidro." if copo_plastico unless
copo_vidro

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

O par de iguais simplesmente uma checagem de identidade.


Os cavalheiros das pontas opostas desta corda parecem ser
iguais?
Desse jeito, voc controla quem o if deixa entrar. Se voc no
3. Enfie as chaves de carro dos lados da
suporta o true assim como eu, receba de peito aberto o false
ma.
(falso).
if sujeito_aproximando == false
print "Chega mais, seu diabo conivente."
end

Mesma coisa para unless. O porto seu. Tome o controle


dele.

Novamente, Eu Quero Que Voc Domine


Agora, est afim de uma viagem mental? O sinal de dois iguais
um mtodo. Voc consegue adivinhar como ele funciona?
Aqui, d uma olhada nele com ponto e parnteses:
4. Cole a face de estrela.
sujeito_aproximando.==( true )

Ruby permite o atalho, sem problemas. Abandone o ponto e


recue, vagarosamente.
Agora, voc se lembra o que deve fazer para dominar no Ruby?
Use as respostas que os mtodos lhe do.
if nil.==( true )
print "Isto nunca vai acontecer."
end

No exemplo acima, como a resposta do mtodo esta sendo


usada?
Pegue a afirmao nil == true. Isso falhar o tempo todo.
No so iguais. Quando no h igualdade, o mtodo do duplo
igual responde com false. Uma balanada de cabea. Esta
resposta dada ao if, que no pode aceitar um false. O
print nunca acontecer.
no_hotel = true
email = if no_hotel
"why@hotelambrose.com"
else
"why@drnhowardcham.com" Voc tem mais duas faces de estrela
end complementares esperando na sua conta.
Mesmo que if no seja um mtodo, o if retorna uma resposta.
Observe o exemplo acima e imagine o que acontece quando
no_hotel true.
O if retornar a resposta dada pelo cdigo que ele decidir rodar.
No caso de no_hotel ser true, a primeira string, meu endereo
de e-mail no Hotel Ambrose, ser retornada. A palavra reservada
else marca o cdigo a ser rodado, uma vez que o if falhe. Se
no_hotel false, o if responder com meu endereo de e-
mail do escritrio do Dr. N. Howard Cham, onde eu recebo meu
aprendizado.

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

print "Digite e seja diablico: "

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.

O mtodo reverse ento usado na String que o gets est


devolvendo. O mtodo reverse parte da classe String. O que Saia na frente com O Colete
significa que tudo que for uma string tem o mtodo reverse
disponvel. Mais sobre classes no prximo captulo, por enquanto do Tigre
saiba apenas que alguns mtodos s esto disponveis para certos
tipos de valores.
Eu no acho que o reverse dar muito certo. As autoridades s
precisam pr um espelho na frente de airgiN ad elortnoc o emoT.
Prendero a gente quando os macacoestrelas comearem a pousar em
Lagos.
As letras maisculas esto nos entregando. Talvez se passssemos
todas as letras na string para maisculas antes de inverter.
ideia_ao_contrario = gets.upcase.reverse

Sua Repetitividade Compensa


Voc me entrega um bloco de notas, cheio de garranchos ilegveis.
Analisando, comeo a notar padres. Notar que voc parece usar as
mesmas palavras repetidamente em suas reflexes. Palavras como
macacoestrela, Nigria, bomba. Algumas frases at. Ponha um fim
nisso. Que so ditas toda hora.
Vamos disfarar esses termos bobos, meu irmo. Vamos ofusc-los
de olhos ardentes que choram para saber nossos delicados planos e
para nos demover de termos grande prazer e muitos karts. Vamos
Quer comear a usar o Ruby junto com a
troc-los pela mais inocente linguagem. Novas palavras com
leitura? Divida sua ateno e veja o Pacote de
significado secreto.
Expanso I: O Colete do Tigre, um mini-
captulo usual que vai te ajudar a instalar o
Ruby. E ainda, aprender como usar Irb e Ri,
dois modos de ajuda que vm com o Ruby e
iro agilizar seu aprendizado.

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'

# Pegar a idia do mal e converter em palavra cdigo


print "Entre com sua nova idia: "
ideia = gets
palavras_codigo.each do |real, codigo|
ideia.gsub!( real, codigo )
end

# Salva o papo-furado num novo arquivo


print "Arquivo codificado. Favor entrar com um nome para essa idia: "
nome_ideia = gets.strip
File::open( "ideia-" + nome_ideia + ".txt", "w" ) do |f|
f << ideia
end

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!)

Arquivos de Texto de um Louco


Vamos salvar a idia codificada em um arquivo.
# Salva as palavras sem sentido em um novo arquivo
print "Arquivo codificado. Favor entrar com um nome para essa idia: "
nome_ideia = gets.strip
File::open( 'ideia-' + nome_ideia + '.txt', 'w' ) do |f|
f << ideia
end

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.)

File::rename( "arquivo_antigo.txt", "arquivo_novo.txt" ) renomear o


arquivo_antigo.txt.

File::delete( "arquivo_novo.txt" ) explodir o novo arquivo.

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.

Acalme-se, Suas Idias No Esto Presas


Aqui, vamos pegar nossas idia de volta em seus verbos originais, para que voc possa ruminar sobre o brilhantismo
delas.
require 'listadepalavras'

# Imprima cada idia com as palavras corretas


Dir['ideia-*.txt'].each do |nome_arquivo|
ideia = File.read( nome_arquivo )
palavras_codigo.each do |real, codigo|
ideia.gsub!( codigo, real )
end
puts ideia
end

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:

['ideia-mostarda-mais-codeina.txt'] (um Array de nomes de arquivos!)

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! ]

4. O Milagre dos Blocos (Blocks)

J que estamos ficando ntimos enquanto compartilhamos este


tempo juntos, eu provavelmente deveria te falar um pouco mais Extrado de Os Comedores de
sobre a histria que aqui se passa. uma boa hora para uma pausa,
eu diria. Cachecis
Primeiramente, voc deve saber que o Blix meu gato. Meu (do Captulo V: Um Homem de Uniforme.)
segundo animal de estimao o Bigelow. E digo, ns dificilmente Em Abril, os lrios verdes voltaram. Eles
nos vemos mais. Ele totalmente auto-suficiente. Eu no sei abriram suas asinhas de anjo, chegando ao
exatamente onde ele mora hoje em dia, ele no mora mais na ante- mundo. Delicadamente, seus rebentos
sala do meu quarto. Ele esvaziou sua conta bancria h cerca de acariciaram os tristes postes da cerca at que
sete meses. eles cantassem alegremente.
Ele tem uma cpia da chave de casa e uma do Cadillac Seville. Se Da janela do seu quarto, Lara olhava os lrios
algum dia quiser voltar, eu alegremente deixarei de lado nossas exibirem sua feminilidade slida. Ela colocou a
diferenas e me entreterei novamente com suas travessuras em franja de um cachecol carpatiano, bordado,
torno de casa. novo, em sua boca e comeu vagarosamente. A
malha longa desceu por sua garganta
Mas no se engane. Eu sinto falta dele por perto. No sei se ele
provocando ccegas enquanto serpenteava pelo
sente falta da minha companhia, mas eu sinto a dele.
esfago. Ela riu e arrotou.
Oh, como a flora a atraa. Olhar para as flores
Uma Sirene e Uma Orao
combinava tanto com ser uma garota
Eu vi o Blix pela primeira vez na televiso quando eu era um adolescente. Ela queria pint-las, ento abriu um
garoto. Ele estrelava um drama policial empoeirado chamado Uma novo modelo no Flash. Um filme vazio dessa
Sirene e Uma Orao. O seriado era sobre um esquadro policial vez.
religioso que fazia seu servio, e o fazia bem, e tinham suas cotas
Ela deixou seu cursor passear pelos jardins da
de milagres nas ruas. Quero dizer, os oficiais no show eram timas
rea visvel do filme. Linhas vetoriais brancas
pessoas, muito religiosos, praticamente um sacerdote. Mas, voc
sob linhas vetoriais amarelas mais curtas. Ela
sabe, at sacerdotes no tm o bom senso de matar um cara que
selecionou as linhas brancas e as agrupou. Ela
tenha ido longe demais. Esses caras sabiam onde traar a linha. E
at moveu as linhas para uma nova camada
chegavam nessa linha todos os dias.
chamada Chora, Anjinho, Chora. Ento ela as
Ento, aquilo era um seriado bem sangrento, mas eles sempre converteu em um objeto grfico e o moveu para
tinham uma boa lio de moral no final. Na maioria das vezes algo a biblioteca.
como, Nossa, escapamos dessa bem rpido. H uma sria
Ela sentiu um calafrio morno enquanto movia as
camaradagem numa declarao como essa.
longas, ptalas brancas para a biblioteca do
O show basicamente girava em torno deste policial. Dick Robinson filme. Aquilo parecia to oficial. Eu escolho
O Doido. As Pessoas o chamavam de O Doido porque voc. Eu nomeio voc. Faam do conforto do
basicamente ele era insano. No me lembro se isso foi meu palcio sua morada eterna.
diagnosticado clinicamente, mas as pessoas sempre questionavam
Heh. Ela sorriu. Colorado Springs no era
suas decises. O Doido regularmente estourava e mordia alguns
nenhum palcio.
policiais, a maioria deles personagens de moral inquestionvel.
Mas todos sabemos que esse um mundo co, as apostas so altas, Desde que eles se mudaram, papai s esteve em
e todos que assistiam ao seriado tinham O Doio com grande casa uma vez. Ele entrou violentamente pela
estima. Eu penso que todos no esquadro cresceram bastante como porta da frente vestindo seu uniforme completo
pessoas, graas determinao do Doido. e j comeou a passar um sermo em Lara e sua
me. Sua me at deixou cair um p de alface
Todavia, os policiais no conseguiam dar conta do servio por si
que ela havia acabado de lavar em um
mesmos. Em cada um dos episdios eles imploravam por uma
pote de Dipnlik.
ajuda maior. E, em cada um dos episdios, eles conseguiam ajuda
de um gato chamado Terry (encenado pelo meu gato Blix). Ele era O alface mal coube no pote, mas ele se alojou l
apenas um gatinho na poca, e como um garoto novo vido por direitinho. Papai veio e sacou o p de alface,
Uma Sirene e Uma Orao, me encontrei na busca do meu prprio fitando-o por algum tempo, at declar-lo PT,
gato-solucionador-de-crimes. Terry levava aqueles caras por tneis em uma voz ao mesmo tempo confusa e
subterrneos, marinas abandonadas, imensos galpes industriais. desapontada. E jogou aquele vegetal sujo na lata
do lixo.
Algumas vezes ele aparecia o episdio inteiro, indo e vindo,
fazendo armadilhas e controlando o trnsito. Mas outras vezes voc Foi s mais tarde aquele dia que a me de Lara
quase no o via no episdio. Ento voc rebobinava e assistia e concluiu que ela poderia simplesmente ter
assistia e assistia. Voc desistia. Ele no estava naquele episdio. cortado o alface ao meio com uma faca eltrica.
Papai sorriu e estapeou a prpria testa. Ele,
Ainda assim, voc no desistia, voc ia quadro por quadro com o
ento, foi at Lara e tambm lhe deu um tapa na
jog do controle, analisando cada cena. E l estava ele. No alto atrs
testa, e em sua me tambm, afetuosamente.
do holofote que foi acionado com muita fora. O que deixou o
Doido com danos permanentes nos olhos. Por qu? Por que Ns no estvamos pensando, no mesmo?
queimar as retinas do seu companheiro, Terry? ele disse. E quem pode nos culpar? Ns somos
uma famlia de verdade hoje. E ns no
Mas a pergunta nunca foi respondida pois a srie foi cancelada.
deveramos ter que fazer mais nada no dia em
Eles comearam a fazer efeitos especiais com o gato e tudo foi por
que reunimos nossa famlia de novo.
gua abaixo. No ltimo episdio, houve um momento em que Terry
estava preso em cima de um guindaste, preste a cair na fornalha de O sorriso de Lara refletiu no vidro do monitor.
uma fundio de ferro. Ele olha para trs. No d para voltar. Ele Ela escolheu o programa de texto e em fonte
olha para baixo. Tapa os olhos com as patas (srio!), ele pula do serifa tamanho 42 escreveu: Pai. Ela criou um
guindaste e, no meio do vo, agarra uma corda e se salva, pousando caminho para ele e deixou que ele caminhasse
num macio antlope oculto que um dos trabalhadores tinha at sumir a direita da tela. Ela chorou por algum
aparentemente bronzeado naquela tarde. tempo depois que aquilo se fora.
As pessoas desligavam a televiso na hora que o seriado ia ao ar.
Tentaram mudar o nome. Primeiro foi Deus nos Deu um
Esquadro. Beijo de Dor. Ento, Beijo de Dor em Maine, j que o
distrito policial inteiro acabou se mudando para l. Mas a mgica se
fora. Eu voltei para escola no vero daquele ano para algumas aulas
e as crianas todas j estavam na onda dos lpis de futebol.

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.

Ordenando e Iterando Para Salvar Vidas


Vamos ordenar seus brinquedos por forma agora, Eu disse. E depois, imprim-los nesta ordem.
brinquedos_do_gatinho.sort_by { |brinquedo| brinquedo[:formato] }.each do |brinquedo|
puts "Blixy tem um #{ brinquedo[:formato] } feito de #{ brinquedo[:material] }"
end

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.

Aqueles Que Fazem as Regras e Aqueles Que Vivem o


Sonho

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

a mesma coisa que:


if 1894 === ano
"Nasceu."
elsif 1895..1913 === ano
"Infncia em Lousville, Winston Co., Mississippi."
else
"Sem informaes para 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.

Mas Estava Ele Doente?? Importando-se com voc. E


Voc sabe, o momento dele era to ruim. Era um desastre como no seu bem-estar.
romancista, mas suas empreitadas na alquimia eram muito
promissoras. Ele tinha um elixir de leite de cabra e sal marinho que Eu preciso que voc esteja num bom estado
melhorava dores nas pernas. Um cara at regenerou um pedao do mental para o resto do livro. Agora hora de
dedo que havia perdido. Tinha um fumo medicinal orgnico que comear a lhe condicionar.
cheirava chul mas lhe dava viso noturna. Ele trabalhava em algo Vamos comear respirando profundamente.
chamado Escada Lquida, mas nunca vi ou li nada a respeito. No Inspire profundamente e conte at quatro
pode ser para subir. Quem sabe. comigo.
Um jornal local uma vez visitou o Dr. Cham. A crtica literria deles Vamos l. 1. 2. 3. 4. Agora expire. Voc pode
lhe deu quatro estrelas. Srio. Ela fez um artigo sobre ele. Deu-lhe sentir seus olhos. Bom, isso mesmo.
uma avaliao.
Agora vamos inspirar profundamente e, na sua
Mas saiba que o Dr. N. Harold Cham se sentia muito mal em relao mente, desenhe um hipoptamo o mais rpido
sua sobrinha. Ele acreditou que o tratamento de choque que puder. Rpido rpido. Suas pernas, sua
funcionaria. A plio a teria matado de qualquer jeito, mas ele tentou. forma, seus dentes de marshmallow. Ok,
Em 9 de Setembro de 1941, depois de sed-la como uma dose de pronto. Agora expire.
fenacetina na sua sala de operaes, ele colocou os clipes condutores
D mais uma boa inspirada e segure. Enquanto
no nariz, lngua, dedos e ombros de Hannah. Com a ajuda de seu voc segura o ar firme no seu peito, imagine
aprendiz, um estudante perspicaz chamado Marvin Holyoake, eles que a presso o est reduzindo ao tamanho de
polvilharam a garota com flocos de uma substncia que o doutor um inseto. Voc segurou seu flego to forte
chamou de opus magnum. Um p de ouro branco que levaria a que agora voc um inseto. E todos os outros
corrente e evidentemente energizaria a menina, forando seu sangueinsetos viram voc diminuir e adoraram a
a aflorar e lutar e vencer. faanha. Eles esto batendo palmas e roando
Mas aquilo no deu muito certo, quando a alavanca foi puxada, ela as anteninhas freneticamente. Mas voc tinha
uma ma na mo quando voc era grande, e
se debateu e chutou e KABLAM! e BLOY-OY-OY-
ela te pegou agora, esmagou toda a multido.
KKPOY! Anis de cabelo e uma parede de luz, e o sino da morte
tocou. A experincia sucumbiu em uma estreita pluma de fumaa e a Voc tambm est morto. Agora expire.
inocncia dela (durante semanas, todo mundo s falava: Ela nunca D-me uma boa respirada e imagine que voc
vai ter a chance de) foi um rombo no cho e nos pulmes deles. vive em uma cidade em que tudo feito de fios
de telefone. As casas so todas de fios de
Para Hannah, eu programo.
telefone, as paredes, o telhado. As portas so
opus_magnum = true um massa densa de fios de telefone que voc
def salve_hannah
sucesso = opus_magnum
simplesmente atravessa. Quando voc vai para
end cama, a cama de fios de telefone. E o colcho
e as molas da cama tambm so fios de
Um mtodo em sua prpria ilha. E o que vai dentro no afetado telefone. Como eu disse, tudo feito de fios de
por simples variveis externas. O Dr. Cham no podia penetrar na telefone. O prprio telefone feito de fios de
doena da sua sobrinha assim como uma varivel opus_magnum telefone. Mas o fio de telefone que vai para
no pode penetrar no exterior de ao do mtodo. telefone feito de po e palitos. Agora expire.
Se rodarmos o mtodo salve_hannah, o Ruby vai chiar conosco, Inspire. 1. 2. 3. 4. Expire.
alegando que no sabe de opus_magnum nenhuma. Inspire em. 1. 2. Inspire mais um pouco. 3. 4.
Estou falando de foco, escopo. Microscpios restringem e Imagine suas mos saindo dos pulsos, voando
magnificam sua viso. Telescpios estendem seu campo de viso. at a tela do computador e programando ele de
No Ruby, escopo referencia o campo de viso dentro de mtodos e dentro. Expire.
blocos. Respire fundo, fundo. Abaixo de voc tem um
A declarao def do mtodo abre sua viso. Nomes de variveis submarino. Ele tem uma lngua. Expire.
introduzidos ali sero vistos pelo mtodo e continuaro valendo at
Respire pelas narinas. Respire fundo. Filtre o
que o end feche seus olhos. Voc pode passar dados para um ar pelas narinas. Respirar pelo nariz te d ar de
mtodo usando argumentos e dados podem ser resgatados do qualidade. Suas narinas se abrem, voc recebe
mtodo, mas os nomes usados dentro do mtodo s valem no escopo o ar da natureza, do jeito que Deus planejou.
dele. Imagine um leitor de disquetes lotado de
Algumas variveis tem um escopo mais amplo. Variveis globais, rfos. Enquanto ele se engasga com os rfos,
como $LOAD_PATH, que comeam com um cifro esto voc tem o timo, o maravilhoso ar de Deus
disponveis sob qualquer escopo. Variveis de instncia como em seus pulmes. Mas este ar prazeroso e que
@nomes, que comeam com uma arroba esto disponveis em todo d a vida vira uma poderosa toxina se voc o
lugar dentro do escopo da classe. A mesma coisa serve para segurar por muito tempo. Rpido, exale o ar
variveis de classe como @@@ingressos@. Variveis de classe e de de Deus e da natureza!
instncia sero exploradas em breve. Agora, voc vai acordar, desamassando as
Blocos tm escopo, mas ele um pouco difuso. Mais flexvel. dobras desta pgina no seu navegador web.
Voc relembrar toda sua vida e no se
verbo = 'salvou' esquecer de nenhuma das vrias aventuras
['sedou', 'polvilhou', 'eletrocutou'].
each do |verbo|
que voc teve nela. Voc se sentir rico,
puts "O Dr. Cham " + verbo + " sua sobrinha Hannah." renovado e mais experiente. Voc no ter
end lembranas deste curto exerccio, na verdade
puts "Sim, o Dr. Cham " + verbo + " sua sobrinha voc vai lembrar de estar ensinando um coelho
Hannah." a uma grande distncia a usar tesouras.

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.

Os blocos podem ver variveis da vizinhana. O bloco viu que a


varivel verbo existia, ele reescreveu o que ela continha e
continuou. Quando o bloco acabou e sua pequena vida se esvaiu, a
varivel verbo saiu de l uma outra criatura.
Se o bloco usar uma varivel que ainda no tenha sido usada
previamente, essa varivel desaparece aps o trmino do bloco. O
escopo do bloco se fecha e a varivel vai junto. Aqui um exemplo
em que verbo no foi usado antes do bloco:
['sedou', 'polvilhou', 'eletrocutou'].
each do |verbo|
puts "O Dr. Cham " + verbo + " sua sobrinha Hannah."
end
puts "Sim, O Dr. Cham " + verbo + " sua sobrinha
Hannah."

D um erro: undefined local variable or method


'verbo'. Poof. (Mtodo ou varivel local verbo no definido.)

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.

2. Um Castelo Tem Seus Computadores

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

Este o fazedor de pedidos.


Na verdade, no, esta a definio de um fazedor de pedidos. Para o Ruby, uma definio de classe. O cdigo
descreve como um certo objeto vai funcionar.
Toda manh, o fazedor de pedidos inicia com at cinco pedidos disponveis para serem concedidos. Um novo
FazedorPedidos criado quando o sol levanta.
pedidos_do_dia = FazedorPedidos.new

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'

frase = 'desejando por chifres'


print frase.length # imprime '19'

pedidos_do_dia = FazedorPedidos.new
pedidos_do_dia.realize( "chifres" )

E, consequentemente, cada objeto tem uma classe nos bastidores.


print 5.class # imprime 'Integer'
print 'desejando por chifres'.class # imprime 'String'
print FazedorPedidos.new.class # imprime 'FazedorPedidos'

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.

Dr. Cham Arrisca Entrar


Mas assim que o Dr. Cham se aproximou do castelo, mesmo o planeta sabendo de seus pensamentos, sentindo sua
surpresa e antecipao, tudo que Dr. Cham sentiu era a morte. Ele subiu os degraus de seu porto frontal, passou
atravs da entrada de mais bela arquitetura e estava quase certo de que ele estava deserto.
Por um tempo ele bateu na porta. O que foi recompensante.

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.

Refeio no Bolso de um Castelo


A medida que continuava sua jornada por entre as passagens (pelo tnel central ramificavam e se juntavam grandes
vazias cavernas), ele escolheu temas em algumas localizaes. Grupos de salas infestadas com maquinaria de
bombeamento. Tecidos e barris de cola dominavam outra rea. Ele seguiu vozes que vinham de uma cavidade
veludosa e macia como travesseiro, o que o levou para um lugar sem sada: uma parede curvada com uma pequena
sala entalhada no nvel dos olhos.
Ele se aproximou da parede e, dentro do buraco quadrado, estavam dois porcos-da-terra comendo mesa.
Eles o encaram serenamente, ambos degustando um pouco de besouros escavados, que davam dois deles, abertos ao
meio e parados com as costas na mesa.
Ol, bonequinhos, ele disse, e eles terminaram suas mordidas e ficaram olhando com seus garfos segurados
distncia.
Eu queria que minha sobrinha Hannah estivesse aqui para conhec-los, disse ele aos atenciosos porcos-da-terra. Ela
pensaria que vocs so um intricado show de ventriloquismo. Ele olhou para a rea da refeio, empilhada como
conjuntos de pratos, toalhas de mo. Metade de um pequeno coelho projetava-se do topo da mquina, gros vermelho
cremosos estavam caindo para baixo dele. Uma porta no fundo da sala estava entreaberta. Dr. Cham podia ver uma
sala cintilante com cadeiras e motores zunindo atravs da porta.
Toda criana gostaria desta casa de bonecas, ele disse. Hannah, minha sobrinha, como mencionei, ela tem uma
boneca que senta em um fuso e comea a soltar fio. uma iluso, claro. A boneca no produz fio algum.
Um dos porcos-da-terra abriu um alapo no cho e pressionou um boto ali, que se iluminou. Ento, um pequeno
projetor de filme veio lentamente sob trilhos. O outro porco-da-terra sentou e olhou o Dr. Cham.
Mas Hannah ainda alcana l no fundo da casa de boneca e pega todos os fios imaginrios formando um mao. Que
ela leva para sua me, minha irm, que muito boa em deixar Hannah de bom humor. Ela costura um vestido no
tamanho da boneca, o qual Hannah leva at a boneca.
E ela diz boneca, Aqui, olhe, seu trabalho duro e perseverana resultaram neste lindo vestido. Agora voc pode
aceitar o convite e acompanhar, hoje noite, o Chefe de Polcia na Manso do Governador. E ela tem uma boneca
vestida de policial que faz o papel do Chefe. Ele muito raqutico para ser o Chefe de verdade, isso precisaria de um
bom pedao de plstico.
O porco-da-terra responsvel pelo projetor o carregou com um rolo e o mirou na parede do fundo. O filme comeou e
os porcos-da-terra se sentaram. Um quadrado verde apareceu na parede. O atencioso porco-da-terra encarou o Dr.
Cham parado.
Seus filmes so coloridos, disse o Dr. Cham. Que vida pequena e amvel.
O filme exibido foi: um quadrado azul. A, um crculo vermelho. A, um quadrado laranja. Os atenciosos porcos-da-
terra se viraram, assistiram a tela virar um tringulo rosa, e ambos porcos-da-terra voltaram a comer.
Uma estrela roxa. Um quadrado vermelho. Com o assentamento do silncio, Dr. Cham podia escutar notas zumbindo
do projetor. Como uma lenta, lerda caixa de som tentando girar suas engrenagens ao longo da linha de trem.
Sim, aproveitem o jantar, disse o Dr. Cham e educadamente se virou, marchando de volta no caminho que ele
tomara.

Outra Rua Sem Sada Onde as Coisas Comeam


Ele se encontrou perdido nos tneis do castelo. Nada parecia familiar. Todavia, ele no estava muito preocupado. Ele
estava noutro planeta. Ele estava perdido de qualquer maneira.
Ele se contorceu pelos tneis, tentando lembrar o caminho, mas muito mais interessado em explorar para lembrar seus
passos. Ele seguiu um nico tnel profundamente, descendo, descendo, ficou to inclinado que ele tinha que pular
entre as beiradas e cuidadosamente achar apoio para os ps. A gravidade aqui no parecia ser diferente da Terra. Ele
escorregava com a mesma facilidade.
Mesmo sem ter absolutamente nenhuma maneira de saber onde ele estava, ele tinha certeza de ter sado dos limites do
castelo. Esta profundidade, este tanto de caminhada. J fazia uma hora desde que ele adentrara a porta. E, a medida
que voltava no tnel, ele tinha certeza que emergiria em um uma nova habitao, talvez at mesmo um buraco em que
ele pudesse espiar para fora e ver o castelo. Talvez ele no devesse ter ido to longe nessa rota. Ele espera que nada
esteja hibernando aqui embaixo.
O tnel chegou ao fim. Um escuro, fim sem sada.

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" ...

Elevador? Exatamente o tipo de classe a se bisbilhotar. Ele tinha onde ir.


irb> Elevador::methods
=> ["method", "freeze", "allocate", ... outra lista grande ... ]
irb> Elevador::class_variables
=> ['@@relatorio_diagnostico', '@@circuito_eletrico_ativo', '@@senha_manutencao']
irb> Elevador::constants
=> []

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

Ele tentou algumas senhas.


irb> e = Elevador::new( "para cima" )
AccessDeniedError: bad password
irb> e = Elevador::new( "subindo" )
AccessDeniedError: bad password
irb> e = Elevador::new( "escadas_sao_terriveis" )
AccessDeniedError: bad password
irb> e = Elevador::new( "EscadasSaoTerriveis" )
AccessDeniedError: bad password

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!"

Agora sim! Conseguimos a senha. Voc viu aquilo?


Ele adicionou um mtodo de classe classe Elevador. No timo como voc pode comear a definir uma nova
classe Elevador e o Ruby simplesmente adiciona suas modificaes na definio de classe j existente?
Mtodos de classe so geralmente chamadas com os dois pontos duplos. Mas, um ponto tambm serve. J que
Elevador uma classe por si s, Ruby vai entender que se voc chama Elevador.senha_manutencao, voc
est chamando um mtodo de classe. Os dois pontos duplos simplesmente ajudam a tornar mtodos de classe bvios
para o leitor.
E justamente. Mtodos de classe so um pouco incomuns. Normalmente voc no quer guardar informao
diretamente dentro de uma classe. Contudo, se voc tem um pedao de informao que voc precisa compartilhar com
todos os objetos de uma classe, ento voc tem um bom motivo para usar a classe como armazenamento.
compreensvel que a @@@senha_manutencao@ tenha sido armazenada na classe, ao invs de em cada objeto
separado. Deste modo, o objeto pode simplesmente alcanar a classe e ver a senha compartilhada.
Provavelmente assim que a proteo por senha funciona.
class Elevador
def initialize( senha )
raise AccessDeniedError, "senha incorreta" \
unless senha.equals? @@senha_manutencao
end
end
Proteger uma classe assim no faz sentido, j que tudo no Ruby pode ser alterado e reescrito e remoldado. O Dr. Cham
tinha a senha e agora o elevador era dele.
irb> e = Elevador.new( "escadas_sao_passado!" )
#<Elevador:0x81f12f4 @level=4>
irb> e.andar = 1

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.

3. A Continuao da Histria do Instrutor Uma noite de voltagem


de rgo da Minha Filha desobstruda
Eu sei que voc pode estar surpreso em saber que eu tenho uma Eu desenterrei esse artigo do The Consistent
filha. Voc pensa que meu estilo de escrever indica uma mente Reminder, um jornal de Connecticut que deu
imatura ou infantil. Bem, por favor relaxe. Eu no tenho uma filha. quatro estrelas na resenha do Dr. Cham.
Mas isso no me impede de pensar no treinamento musical dela. Midgie Dare, a resenhista do livro que
Enquanto essas histrias do planeta Endertromb me eram relatadas, subitamente estendeu seu olhar crtico a
qualquer coisa tangvel, elogiou o Doutor por
eu me vi vagando por corredores, passando as pontas dos meus
suas maneiras e inovaes na mesma edio
dedos por sofs fortemente atados e me envolvendo nos gritos
diria em que ela difamou a meloa e diminuiu
saturados dos tubos, enquanto o instrutor de rgo da minha filha
Manitoba por ter um pssimo servio
tocava. Suas notas ressoavam to ocas e profundas nas paredes de
sua manso que eu comecei a confundi-las com um silncio nefasto, telefnico.
e achava ainda mais fcil me recolher ao espao infinito dos meus Eu consegui um pedao do final do artigo dela.
pensamentos. Para pensar no planeta ancestral e suas filosofias Aqui vai.
obscuras: seus templos carnais, corados com os resduos drmicos Ele desmontou do cavalo com um
dos seus mrtires; seus cartis de baleias, engolindo seus inimigos e cuidado inquestionvel por
prendendo-os por dcadas, arrastando-os para cima e para baixo em qualquer um que estivesse nas
suas escadarias de costelas; suas brumas venenosas e seus portais redondezas. Corts de todos os
dolorosos; e, as cruis dinastias dos Originais, a espcie que clama lados, ele desceu da sela
paternidade de toda vida inteligente no universo. gentilmente, desacelerando para
Mas, eventualmente, eu ouvia aqueles tubos de oitavas mais altas um ritmo que deveria ser medido
cantar e acabava voltando para a mesma tarde jovial de onde havia em micrmetros por segundo para
sado. ser apreciado.
interessante como at a brisa do nosso planeta uma coisa um
tanto estranha para forasteiros. Ele tambm me contou sobre Seus companheiros entre ns
viajantes de Rath-d, que se aventuraram na Terra cinco sculos atrs, ficaram boquiabertos, assistindo
mas se dissiparam rapidamente nas nossas correntes de ar j que sua bota tocar o cho. Um passo
eles, seus equipamentos e suas armaduras eram todos feitos de to limpo e preciso que parecia que
carvo. jamais encontraria o solo, apenas
deslizaria suavemente sobre ele.
Eu tinha me sentado ao rgo, ouvindo as histrias sobre sua Ento, antes que a aterrissagem
colnia, enquanto ele acentuava suas sinfonias e as histrias fosse notada por ns, estvamos
desapareciam por um tempo, at que a melodia terminasse. Ele indo para a cozinha, levados pela
falava sobre si e seus irmos sendo abraados pela cauda de sua me onda de felicidade que sempre
e rasgando o tecido macio da parede interna. Um sabo suculento, estava logo a frente de Harold
esponjoso e melado que limpou suas bocas e esfagos enquanto Cham, e sempre logo atrs dele, e
descia. Eles mastigaram e roeram fortemente aquilo e espuma se especialmente concentrada
formava. Depois de comer, eles sopraram bolhas uns sobre os diretamente no seu prprio ser
outros, cada bolha cheia de uma espuma densa, sobre a qual iluminado.
dormiram. E de manh bem cedo, quando a me os soltava do
abrao, ela observava serenamente enquanto seus bebs dormiam Ele tambm carregava livremente
em um ensopado de almndegas escuras e um molho doce e ao seu lado a filha especialmente
grudento. ignorante de um estadista, que no
Ele soletrou todos os gostos de Endertromb. Dos seus rgos cor de nos deixava em paz com suas
salmo engomados, que se tornavam uma pasta quando cozidos, e constantes crticas aos atestas e a
seus olhos que derretiam e viravam um rico creme. Das suas rotas ferrovirias.
manteigocias com tentculos. E ele estava apenas comeando a
apreciar essas delcias, ainda criana, para ser elevado de um jardim Em casa, meus esforos para
de infncia por um par de elefantes pigmeus que desceram um acender uma vela foram inteis
enorme guindaste dos cus, e o ergueram pela gola. graas a novos abalos causados por
Eles o transplantaram para a Terra, o guiaram em seu ofcio, trens, que jogavam o fsforo na
trombeteando suas trombas alto para a cidade de Grand Rapids minha mo para perto das
ouvir, ento se foram, chorando e abraando uns aos outros. cortinas! Ela ridicularizou o Dr.
Cham por seu suave agarre no
Mas, estranhamente (em-pithy-dah), Eu aprendi, toquei (pon-shoo) brao dela e sentiu cimes quando
nos rgos no meu planeta (oth-rea) natal, ele disse. ele conseguiu sintonizar uma voz
O instrutor de rgo da minha filha fala essas palavras extras que feminina agradvel no rdio logo
voc v em parnteses. Quem que sabe se sua lngua nativa ou que eles voltaram para sua
seu soluo sonoro. Ele mantm outro trao de Endertromb: ele tem residncia.
doze nomes.
O sol se ps, entretanto, e ns nos
vimos em um deslumbre conjunto
embaixo de espessas partculas de
algodo que flutuavam pela sala do
piano, um tanto entretidas pelo
Programa Soneca da Tarde, que
tocava na vitrola com o volume to
baixo na estao que ns s
conseguamos ouvir o arrastar das
mangas do finado Napoleo pelos
lenis. Eu sinto um calafrio s de
pensar! Ainda assim, em cadeiras
distantes, os dois amantes
mantinham uma distncia grosseira
entre eles e eu me senti cercado
pelo olhar acalentador do Dr. Cham
enquanto bebia jocosamente sua
taa de vinho xerez.

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.

Protetores Auriculares Livres de Murmrio

Ento eu disse a Paij-ree, Paij-ree, eu estou escrevendo um


livro. Para ensinar ao mundo Ruby.
Oh, (pill-nog-pill-yacht) bacana, ele disse. Ele conhece
Ruby h mais tempo que eu, mas mesmo assim: Eu serei o
instrutor de Ruby da minha filha.
E eu disse, Paij-ree, voc est no livro. E as estrias do seu
planeta. Eu falo com ele como se ele fosse o E.T. Eu no
sei por qu. Como o que eu disse em seguida: E da talvez
algum dia voc possa ir para casa para o seu pai e para sua
me!
Ele replicou, (pon-shoo) (pon-shoo) (em-pithy-dah). Que
o jeito dele de expressar em voz alta seu silncio e receio.
Ele queria ver o que eu havia escrito, ento eu mostrei a ele este pequeno mtodo que escrevi para voc.
def limpar_murmurios_de( frase )
while frase.include? '('
abre = frase.index( '(' )
fecha = frase.index( ')', abre )
frase[abre..fecha] = '' if fecha
end
end

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

E saiu de certa forma uma frase mais clara.


Mas, estranhamente, Eu aprendi, toquei em rgos no meu planeta natal.

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

Aqui, entorte o graveto antes de jog-lo.


graveto = "Aqui est um ( graveto entortado."
limpar_murmurios_de( graveto )

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

Imediatamente ouve-se um sussurro


nas rvores atrs da casa do Paij-ree
e acabou que era o homem que cara
do cu. Seu nome era Doug e ele
vendia gatos.
Ento, assim que ele aparecer, quando sua sombra (e as sombras dos gatos amarrados aos seus ps) entrou na frente do
pssaro no gramado que ns estvamos tentando acertar com uma raquete, enquanto ele retirava o hlio do grande
balo, ns gritamos, Ol, Doug!
E ele diz, Ol, Gonk-ree! Ol, Why!
Paij-ree checa os bolsos para ter certeza que tem o real-e-vinte-sete que vai precisar para comprar os trs gatos que
precisa para manter a fornalha abastecida e a parablica virando. Estes gatos geram montes de eletricidade esttica
quando Paij-ree os joga no gerador, onde eles estaro em inferioridade numrica a gigantes bastes de vidro, que os
acariciam continuamente Mas, espere! Voc reparou como o corretor de gatos chamou ele de Gonk-ree?
E ele o chama de Gonk-ree de dia e Gonk-plo de noite.
Ento o sufixo definitivamente relacionado luz do sol. At onde sei, o prefixo indica a relao de quem chama o
Paij-ree.
class String

# As partes do nome do professor


# de rgo da minha filha.
@@silabas = [
{ 'Paij' => 'Pessoal',
'Gonk' => 'Negcios',
'Blon' => 'Escravo',
'Stro' => 'Mestre',
'Wert' => 'Pai',
'Onnn' => 'Me' },
{ 'ree' => 'AM',
'plo' => 'PM' }
]

# Um mtodo para determinar o


# signficado de certos nomes dele.
def significado_do_nome
partes = self.split( '-' )
silabas = @@silabas.dup
significado = partes.collect do |p|
silabas.shift[p]
end
significado.join( ' ' )
end

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

No mtodo significado_do_nome, encontre o loop. Aprender sobre Array#collect essencial. Vamos


olhar de perto.

significado = partes.collect do |p|


silabas.shift[p]
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 odeio aquele livro, disse a cabra. Eu acho que o autor insincero.


Mesmo? perguntou o Dr. Cham.
Tenho certeza que tudo verdade. Mas muito enfeitado. Eu fico tipo: Chega. J entendi. Pra com isso.
No tenho muita certeza do que fazer com isso, disse o Doutor. Parece um esforo honesto. Na verdade, eu escrevi
algo em Ruby l atrs.
Isto no d s cabras uma boa reputao, disse a cabra.
Mas voc a nica cabra no livro, disse o Doutor.
E totalmente mal interpretada.

A cabra fechou sua boca e Dr. Cham acalmou-se.


Na verdade sou bastante letrada, disse a cabra. Embora, recentemente, eu estou vendo mais filmes. Eu amo filmes
estrangeiros. Um de meus parentes acabou de trazer Ishtar do seu planeta. Uau, aquilo foi excelente.

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."

Que imprime, Ns temos quartos de 3 camas, 4 camas, 6 camas disponveis.


Dr. Cham estava procurando por um banheiro, mas s tinham videotapes arquivados para todo lado. Ele acabou
encontrando um lugar, que poderia ser um banheiro. Tinha um recipiente metlico. Mais importante que isso, era
escuro e escondido.
Enquanto ele est l, deixe-me acrescentar que enquanto Os Originais massacraram Os Invasores para provar seus
direitos como Criaturas de Primeiro Escalo, com o Objeto Ruby, no existe tal disputa. Ele o rei Objeto absoluto, o
Primeiro.
Observe.
irb> Class.superclass
=> Module
irb> Kernel.class
=> Module
irb> Module.superclass
=> Object
irb> Object.superclass
=> nil

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

# Uma CONSTANTE repousa perto da porta. timo.


HOMEM_DESDENTADO_COM_GARFO = ['homem', 'garfo', 'chicletes expostos']

# Uma Class est comendo, vivendo bem na cozinha.


class CriancaGordaDeCera; end

# 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

Agora voc tem que ir pela Santa Ins para ach-los.


>> AtenciosaSantaInes::HOMEM_DESDENTADO_COM_GARFO
=> ["homem", "garfo", "chicletes expostos"]
>> AtenciosaSantaInes::CriancaGordaDeCera.new
=> #<AtenciosaSantaInes::CriancaGordaDeCera:0xb7d2ad78>
>> AtenciosaSantaInes::instance_methods
=> ["timida_garota_com_cara_de_raposa"]

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"]

Na verdade, ningum roubou da AtenciosaSantaInes, somente pegaram emprestado. A


timida_garota_com_cara_de_raposa agora tem dois endereos.
Voc deve admitir. O velho mosteiro pode ser comprado um zilho de vezes e a pequena garota-com-cara-de-raposa
ainda estar nos fundos no armrio banana esperando uma noz de carvalho! Que pena que no podemos aliment-la.
Ela um mtodo sem argumentos.
Quando Dr. Cham retornou renovado, a tira de filme estava um pouco atrasada. Mas a cabra no notou, ento o Doutor
avanou alguns quadros at fazer algum sentido.
Ento os invasores deixaram o planeta.
Este planeta decrpito, disse o Dr. Cham. O castelo bacana. Mas por dentro um desastre.
O castelo parece uma projeo, disse a cabra. Todas as flores e brotos de ma e at mesmo o cu. uma projeo
de baixa resoluo.
Sim? Ele encantador.
Eu acho.

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.

Caando Uma Voz


Eu no acho que tenha sido o projetor, disse o Dr. Cham. Alguma coisa voou pela tela e proferiu um gemido
furioso.
Eu no tenho nenhuma cpia deste filme, disse melancolicamente a cabra. E aquela garota. A diretora de elenco.
Eu nunca mais a verei novamente.
Dr. Cham levantou-se e olhou para os largos corredores de carnificina magntica, procurando.
Oh, ei, voc deveria chamar aquela garota, a cabra continuou. Voc poderia conversar com ela, chegar a um
consenso. Diga a ela sobre mim. No aja como se fosse meu amigo, s, voc sabe, Oh, aquele cara? Eh, mas que
bobalho.
Dr. Cham mirou a porta e saiu.
Os corredores eram todos um outro mundo de baguna. Nos arquivos da cabra, as estantes estavam desarrumadas. No
corredor, as estantes estavam completamente tortas. Pias caam pelo teto. O Doutor se aventurou por baixo dos
escombros, chutando compensados de madeira quando necessrio.
Voc no deveria estar aqui fora, disse a cabra. Voc est na propriedade de outra pessoa aqui. Um casal de
elefantes pigmeus so donos disso tudo. Eles so sujeitos maus. Vo te dar uma surra com suas trombas. Elas as
enrolam e simplesmente do porrada.
Dr. Cham tirou um arquivo do seu caminho, que caiu por uma frgil parede, e ento pelo cho do cmodo ao lado. E
eles o ouviram caindo por vrios andares depois.
Eu estou tentando lembrar como isso acontece no livro, disse o Dr. Cham, enquanto andava ligeiramente pelo hall.
Aquela neblina leitosa que varreu a projeo. Ns encontramos aquela coisa. Ele sacudiu uma maaneta, quebrou-a.
Vagarosamente, passou pela porta e l desapareceu.
Voc tem o dom de destruir as coisas com um chute, no tem? disse a cabra. Paredes, portas. A cabra chifrou a
parede ao estilo Zidane. A parede estremeceu e ento permaneceu em silncio.
Ento, tudo ficou calado. E sombrio.
A cabra ficou firme no glido corredor, esperando Dr. Cham revirar algumas mesas e emergir, pronto para continuar a
partir do cmodo que ele estava. Mas o Dr. Cham no voltou, e a cabra optou por compartilhar um momento com os
destroos negligenciados deixados por seus vizinhos. No que ela pudesse velos de verdade. Ela podia apenas escutar
os sussurros ocasionais das pilhas de faturas, cpias mestre de papel carbono e envelopes manilha quando deslocava
suas pernas.
O cho parecia entortar-se bem perto da cabra, como se as pilhas de tralhas ao seu redor estivessem comeando a
deslizar em direo a seu peso. Ele estaria no centro deste redemoinho de documentao elefantstica. Morreria ele
primeiro pelos cortes causados pelo papel? Ou ele ficaria sufocado sob o slido funeral de suprimentos de escritrio?
Uma luz suave, no entanto, pairou sobre ele. Uma luz prateada, flutuante. No, era uma eram tesouras? As tesouras
cresceram em um cintilante agrupamento de po inteligente, cada fatia sufocada de glitter. Mas, no, eram mos. E um
chapu de Pscoa.

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.

5. O Roubo do Capito Loteria


E agora, as histrias das Loterias Paij-ree.
Em Endertromb, o pai do organista inventou a loteria. A idia
surgiu quando ele estava rezando para o Escavador Dosh.
Escavador Dosh uma espcie de Deus para eles. Mas dez
vezes mais assustador. Esse cara cavou um tnel infinitamente
profundo atravs do planeta e saiu morto. Mas ele no est realmente morto. Ele est realmente um segundo atrs
deles. E ele come tempo.
meio complicado, porque o Escavador Dosh mata totalmente as pessoas. Mas acho que se voc faz o que ele diz,
no to ruim. Talvez eu fale sobre isso mais tarde. to doloroso falar sobre isso por ser algo to assustador. Alm
disso, um dos meus amigos realmente acredita em toda a coisa. Eu fico meio que chocado no como se estivesse
chorando, mais como se estivesse engasgado.
De qualquer forma, enquanto rezava, trs nmeros vieram para o pai do Paij-ree.
Ele ento se perguntou. O que so esses nmeros?
E sua mente passou um pequeno vdeo clipe dele vendendo todos os tipos de nmeros. E, por anos e anos, viajando e
vendendo nmeros.
E indagou ao seu crebro, Pessoas compraro nmeros?
E seu crebro disse, Se comprarem os trs nmeros corretos, d a eles um prmio.
Foi quando ele se imaginou saltando de uma rampa de ski e jogando presentes para as pessoas. Sem dvidas: ele seria
um cone.
Ento ele foi e fez o que seu crebro disse e vendeu nmeros. A simples loteria do pai consistia em trs nicos
nmeros, retirados de um conjunto de 25 nmeros.
class BilheteLoteria

INTERVALO_NUMERICO = 1..25

attr_reader :numeros_escolhidos, :data_compra

def initialize( *numeros_escolhidos )


if numeros_escolhidos.length != 3
raise ArgumentError, "trs nmeros devem ser escolhidos"
elsif numeros_escolhidos.uniq.length != 3
raise ArgumentError, "os trs escolhidos devem ser diferentes"
elsif numeros_escolhidos.detect { |p| not INTERVALO_NUMERICO === p }
raise ArgumentError, "os trs escolhidos devem ser nmeros entre 1 e 25."
end
@numeros_escolhidos = numeros_escolhidos
@data_compra = Time.now
end

end

Sim, a classe BilheteLoteria contm os trs nmeros (@numeros_escolhidos) e o momento em que o


bilhete foi adquirido (@data_compra). O intervalo de nmeros permitidos (de um a vinte e cinco) mantido na
constante INTERVALO_NUMERICO.
O mtodo initialize pode ter qualquer nmero de argumentos passados. O asterisco no argumento
numeros_escolhidos significa que quaisquer argumentos sero passados como um Array. Ter os argumentos
em um Array significa que mtodos como uniq e detect podem ser usados juntos aos argumentos.

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

Atributos so mtodos empacotadores (wrappers) para variveis de instncia (assim como


@numeros_escolhidos) que podem ser usados fora da prpria classe. O pai do Paij-ree queria codificar uma
mquina que pudesse ler nmeros e a data da compra do bilhete. Para fazer isso, estas variveis de instncia devem ser
expostas.
Vamos criar um bilhete aleatrio e ler os nmeros de volta:
bilhete = BilheteLoteria.new( rand( 25 ) + 1,
rand( 25 ) + 1, rand( 25 ) + 1 )
p bilhete.numeros_escolhidos

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]

Eu receberei um erro: undefined method `numeros_escolhidos=` Isto porque attr_reader somente


adiciona um mtodo de leitura, no um mtodo de escrita. Entretanto, isso bom. Ns no queremos que os nmeros
ou a data mudem.
Ento, os bilhetes so objetos. Instncias da classe BilheteLoteria. Faa um bilhete com
BilheteLoteria.new. Cada bilhete tem as suas variveis de instncia @numeros_escolhidos e
@data_compra.
O capito loteria teria necessidade de gerar trs nmeros aleatrios no encerramento do sorteio, por isso vamos
acrescentar um mtodo de classe conveniente para gerao aleatria de bilhetes.
class BilheteLoteria
def self.novo_aleatorio
new( rand( 25 ) + 1, rand( 25 ) + 1, rand( 25 ) + 1 )
end
end

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

Yal-dal-rip-sip foi o primeiro cliente.


SorteioLoteria.compra 'Yal-dal-rip-sip',
BilheteLoteria.new( 12, 6, 19 ),
BilheteLoteria.new( 5, 1, 3 ),
BilheteLoteria.new( 24, 6, 8 )

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 ]

A sintaxe ||= um atalho.


vencedores[comprador] = vencedores[comprador] || []
O pipe duplo um ou lgico. Faa vencedores[comprador] igual a vencedores[comprador] ou, se
vencedores[comprador] nulo, faa-o igual a []. Este atalho um pouco estranho, mas se voc puder abrir
sua mente, ele um bom mtodo para economizar tempo. Voc est se certificando que uma varivel est inicializada
antes de us-la.
irb> SorteioLoteria.jogo.each do |vencedor, bilhetes|
irb> puts vencedor + " ganhou com " + bilhetes.length + " bilhete(s)!"
irb> bilhetes.each do |bilhete, pontuacao|
irb> puts "\t" + bilhete.numeros_escolhidos.join( ', ' ) + ": " + pontuacao
irb> end
irb> end

Gram-yol ganhou com 2 bilhetes(s)!


25, 14, 33: 1
12, 11, 29: 1
Tarker-azain ganhou com 1 bilhetes(s)!
13, 15, 29: 2
Bramlor-exxon ganhou com 1 bilhetes(s)!
2, 6, 14: 1

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

Que faz exatamente o mesmo que este cdigo comprido:


class BilheteLoteria
def numeros_escolhidos; @numeros_escolhidos; end
def numeros_escolhidos=(var); @numeros_escolhidos = var; end
def data_compra; @data_compra; end
def data_compra=(var); @data_compra = var; end
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

# Uma lista de notas vlidas.


NOTAS = [:Ab, :A, :Bb, :B, :C, :Db, :D, :Eb, :E, :F, :Gb, :G]

# Armazenas as trs notas escolhidas e as datas de compra.


attr_reader :escolhidas, :comprado

# Cria um novo bilhete a partir das trs notas. As trs notas


# devem ser nicas.
def initialize( nota1, nota2, nota3 )
if [nota1, nota2, nota3].uniq!
raise ArgumentError, "as trs escolhidas devem ser diferentes entre si"
elsif escolhidas.detect { |p| not NOTAS.include? p }
raise ArgumentError, "as trs escolhidas devem ser notas da escala cromtica."
end
@escolhidas = escolhidas
@comprado = Time.now
end

# Faz a contagem do resultado (escore) do bilhete contra o resultado do sorteio.


def escore( final )
contador = 0
final.escolhidas.each do |nota|
contador +=1 if escolhidas.include? nota
end
contador
end

# Construtor para criar um BilheteLoteriaAnimal aleatoriamente


def self.novo_aleatorio
new( NOTAS[ rand( NOTAS.length ) ], NOTAS[ rand( NOTAS.length ) ],
NOTAS[ rand( NOTAS.length ) ] )
rescue ArgumentError
redo
end

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.

6. Eles que Fazem as Regras


Hannah saltou de volta a parede e apoiou-se em seus dedos.
Est a parede, disse Dr. Cham. Os Originais esto a dentro. Minha filha, voc pode levar-nos ao convs de
observao?
Voc espera que a gente v contra estes caras? indagou a cabra. Eles so doidos como coalas. Mas estes coalas tem
lasers!
De qualquer forma, ns vencemos. disse Dr. Cham. Voc e eu sabemos disso.
Ok, bem, estou confuso em relao a isso, disse a cabra. Ns realmente vencemos? Ou podemos estarmos
pensando sobre o Kramer contra Kramer? Quem venceu foi o Dustin Hofmman ou fomos ns?
Na na ni na no. Hannah flutuou e nervosamente arrastou suas pernas junto da parede. Tem um homem com uma
cara enorme l!
O Sr. Cara, disse o Doutor. Ele o rosto original.
Ele no me viu, disse Hannah e lamentou-se. HOMA-HOMA-ALLO-ALLO.
Ela fez aquele furo gotejante atravs dos gastos buracos de rato e das portas de congeladores, fluindo para dentro e
para fora, levando os pontos de controles do vdeo a assobiar e os painis da parede a se atarem a si mesmos e
desabarem no silncio. Os trs passaram atravs dos dois desgastados nveis de segurana e emergiram no convs de
observao tendo uma vista panormica do compartimento de cargas.

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.

7. Eles Que Viveram o Sonho


Apesar da arte dos Originais ter desaparecido h muito, Dr. Cham trabalhou freneticamente no computador acoplado
ao painel de controle sobre o convs de observao. Hannah havia desaparecido dentro do cho (ou talvez aquelas
pequenas fascas ao longo do caminho eram ainda rastros de sua presena paranormal!) e a cabra amigavelmente
assistiu Dr. Cham hackear um mdulo Ruby.
require 'endertromb'
module EscanerPedidos
def escanear_por_um_pedido
desejo = self.read.detect do |pensamento|
pensamento.index( 'pedido: ' ) == 0
end
desejo.gsub( 'pedido: ', '' )
end
end

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.

ltima Baleia para Pessoasenlameadas


A atarracada e mal humorada baleia apareceu na entrada do castelo, onde Hannah estava chacoalhando um boto de
rosas com sua mo. Ela golpeou a Baleia com a mo, mas esta apenas permaneceu perfeita, confortvel e firme contra
o cu slido e azul de Endertromb.
Estou entediada, disse ela a baleia. BOHR-BOHR-OHRRRRRR.
Ok, disse a baleia, profundamente e suavemente. Enquanto a palavra deslizava junto de sua pesada lngua, suas
bordas dividiam-se e a palavra saia polida e vestida numa bolha pelo canto de sua boca.
Eu sempre tenho que morrer, disse a jovem fantasma. As pessoas sempre me matam.
A baleia sacudiu suas curtas nadadeiras, que se encontravam a uma distncia intil do solo. Ento, ela se moveu com
esforo em direo a menina com sua cauda. Lanando-se sobre os pedaos de grama.
As pessoas matam, ento, quem elas matam? disse a menina. Eu. Elas me matam todas as vezes.
A baleia conseguiu chegar a trs metros da garota onde se erguia como um grande monumento de guerra que
representava um nmero suficiente de soldados mortos a ponto de trazer um ruidoso passo at voc. E agora a baleia
descansava sua cauda e, exausta pela escalada at ento, deixou suas plpebras se cerrarem tornando-se uma
levemente inchada montanha de barro. Sua farta sombra dobrou-se em volta da quase imperceptvel Hannah.
Mas outra sombra apareceu, estreita e determinada. Bem atrs dela, a mo veio sobre seu ombro, e o fantasma quente
dentro da mo tocou sua manga.
Como voc chegou aqui embaixo? disse a garota.
Dr. Cham sentou bem do lado dela e o bode deu a volta e sentou em frente.
Escute aqui, disse Dr. Cham. Ns temos que seguir este grupo malvado de vndalos at o fim, Hannah. E para
apanh-los, ns precisamos de sua fiel ajuda!
Estou com medo, chorou Hannah.
Voc no est com medo, disse o bode. Vamos. Voc uma criana fantasma intimidante.
Bem, ela disse. Estou um pouco entediada.
Dr. Cham se ajoelhou, trazendo sua presena cabeluda para o cho, seu rosto a apenas alguns centmetros do dela. Se
voc vier conosco, se voc pode acreditar no que sabemos, ento poderemos pegar esta trupe revoltante. Agora, voc
diz que seu destino ser uma confeiteira. No vou entrar no mrito. Voc tem todo o direito do mundo e de
Endertromb, no caso de se tornar uma confeiteira. Digamos que, se voc no se tornar uma confeiteira, ser uma
grande tragdia. Quem que vai cuidar de todos aqueles donuts se no for voc?
Ela deu de ombros. isso que eu venho dizendo.
Voc est certa, disse o Doutor. Voc vem dizendo isso desde o comeo. Ele olhou para o cu, onde o vento
assobiava pacificamente apesar da furada forada do foguete dos Originais. Se o seu destino ser uma confeiteira,
ento o meu acabar com tudo isso, acabar com a confuso que est comeando a se formar. E escute-me, menina
oua o quo certa e slida a minha voz fica quando eu digo isto eu acabei com sua vida, eu tenho total
responsabilidade por sua vida como uma apario, mas eu a trarei de volta. Vai levar mais tempo que um donut, mas
voc vai ter uma infncia real. Eu prometo.

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.

1. Se Eu Estivesse Procurando Por um Veculo

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

open( http://preeventualist.org/lost ) do |perdido|

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!
---

este servio comissionado e subsidiado


em parte pelo Cl de Estudo Jovem
Ashley Raymond

...
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 :(

eu verifiquei: * a mesa da frente * o corredor * a sala de espera * o banheiro * a dispensa


* a
grande sala de TV * o balco * a sala de alunos * a antiga sala do gaff (aquela com a
pintura de p
de cereja) * o quarto de empregada * escadaria * eu irei atualizar isto, assim que eu
encontrar
mais cmodos.
- com amor, perry

/ 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

/15 de novembro de 2004 /


promoo do dia dos "esperanosos". se voc perdeu algo hoje, pode escolher um item grtis
(no valor de $40 ou menos) da casa de algum que encontrou algo.
ns estamos nos divertindo tanto com isso!! EXATAMENTE assim que eu consegui minha mquina
de remar no ano passado e eu a AMO!

- 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
=====================

O A&P um servio gratuito. Os atos de perder e achar so qualidades essenciais para


a construo de um estilo de vida pr-eventualista. Esperamos atender a sua crena.

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'

# Pesquisar todos os itens achados contendo a palavra 'caminhao'.


open( "http://preeventualist.org/lost/searchfound?q=caminhao" ) do |truck|
puts truck.read
end

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'

# Abrindo um arquivo em um diretrio do seu computador.


open( "diretorio/ideia-sobre-esconder-alface-nas-cadeiras-da-igreja.txt" ) do |ideia|
puts ideia.read
end

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'

# Abrindo um arquivo disponvel num Web Site.


open( "http://sua.com/ideia-sobre-esconder-alface-nas-cadeiras-da-igreja.txt" ) do |ideia|
puts ideia.read
end

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.

Lendo arquivos linha a linha


Quando voc usa OpenURI para obter informaes da web com os mtodos open and read, a pgina enviada
como um String. Voc tambm ler a pgina uma linha de cada vez, se est procurando algo. Ou se a pgina muito
grande e voc quer economizar memria do seu computador.
require 'open-uri'
open( "http://preeventualist.org/lost/searchfound?q=caminhao" ) do |caminhao|
caminhao.each_line do |linha|
puts linha if linha['picape']
end
end

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.

Yielding como blocos de montar


Ruby frequentemente usa iteradores dessa forma. Sim, iteradores so usados para percorrer cada um dos itens de uma
collection (coleo), como um Array ou um Hash. Ento, olhe para uma fonte de IO como uma coleo de linhas. O
iterator (iterador) pode percorrer essa coleo de linhas.

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 }

# O estilo verboso de anexar um bloco.


# Aqui o bloco demarcado por 'do' e 'end'
open( "idea.txt" ) do |f|
f.read
end

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

# Imprime os arquivos lado a lado


double_open( "idea1.txt", "idea2.txt" ) do |f1, f2|
puts f1.readline + " | " + f2.readline
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.

Pr-eventualismo numa Caixinha Dourada


Voc j aprendeu o bastante sobre OpenURI e yield para escrever os seus prprios iteradores. Voc j sabe como
usar o servio de achados e perdidos. Na verdade, voc j pode comear a se aventurar nos achados e perdidos de Wixl
sem mim.
Vamos encapsular elegantemente todo o servio em uma nica classe.
require 'open-uri'
module PreEventualista
def self.open page, query
qs =
query.map do |k, v|
URI.escape "#{ k }=#{ v }"
end.join "&"
URI.parse( "http://preeventualist.org/lost/" + page + "?" + qs ).open do |lost|
lost.read.split( "--\n" )
end
end
def self.search word
open "search", "q" => word
end
def self.searchlost word
open "searchlost", "q" => word
end
def self.searchfound word
open "searchfound", "q" => word
end
def self.addfound seu_nome, item_perdido, achado_em, descricao
open "addfound", "name" => seu_nome, "item" => item_perdido,
"at" => achado_em, "desc" => descricao
end
def self.addlost seu_nome, item_achado, visto_em, descricao
open "addlost", "name" => seu_nome, "item" => item_achado,
"seen" => visto_em, "desc" => descricao
end
end

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

3. Um Assassinato de Drago Patrocinado

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.

BRAIDQUEST!! A esta altura, ele j tinha chegado a casa dos


cinqenta anos de idade e queria se vangloriar no
Voc devia receber uma parte da comisso do vendedor, afirmou reino dos mestres lendrios. Ento ele comeou a
Raposinho. O pessoal veio ver voc matar o drago, certo? construir uma escultura enorme de duas peras
MAS!! Eu no opero os braos-mecnicos que extraem o com gotas de orvalho levemente pressa a elas.
chocolava." A escultura era enorme e pairava
Eu s estou tentando dizer que voc faz funcionar a mquina de preocupantemente acima da cidade natal do
matar. Ento voc deve ter uma parte nisso. escultor, mantida afastada por uma pesada infra-
AH NOO!! Deixei minha folha de alface favorita no Array de estrutura de vigas e estacas. De fato, aquelas
pras gigantes, de to grandes, acabaram por
Dwemthy!! gritou o coelho, girando feito um peo. Ao fundo:
afetar at mesmo o eixo de rotao da Terra, que
Ou quem sabe no carro do Lester?
passou a girar acompanhado por um cesto de
Quer saber meu deus, d para parar quieto?? Pediu raposinho. frutas do tamanho de um asteride orbitando em
Meu rdio, disse Raposinho, voltando vida por um instante, sua volta.
na minha picape. Aquele olhar ainda distante. Seu olhar parece O governo enviou jatos e avies de guerra para
voltar, mas logo se distancia, lembranas de outros lugares e destruir a esttua. Eles atacaram violentamente a
outros momentos. Uma viagem de carro para Maryland. A voz de vila, destruindo a esttua, despedaando em
Lionel Richie ao fundo. Os limpadores de pra-brisas ligados meio milhares de pedaos, escavando-a com msseis.
rpidos demais. Ele para em uma casa. Sua mo abre a porta. Ele Logo aps a esttua ser destruda, tudo voltou ao
uma raposa bem peluda. Lgrimas e maquiagem. normal.
Bem, voltando: Aquele porco-espinho est trocando as estaes Um enorme pedao da esttua ganhou rbita e
O coelho subiu no brao do banco e falou de perto. MAS!! Logo por vrias vezes aproximou-se perigosamente da
eu vou fazer um banquete com a cabea do drago e com os sucos Terra. Quando isso acontecia, era sempre
da lngua do drago." O coelho sentou e ajeitou suas patas encontrado por um arsenal avanado, que
delicadamente. ajudava a danific-lo e desviava seu curso para o
cus.
(Que eu espero que tenha o mesmo gosto de ursos de canela)
sussurrou o coelho para si mesmo. Finalmente, este meteoro involuntrio no estava
mais do tamanho de um homem assustador. E
Adoro canela, disse Raposinho. Eu devia sair para matar quando ele, por fim, caiu na terra, desgastado e
drages com voc um dia desses. polido pela sua jornada de noventa anos, ele foi
Voc devia, mesmo disse o coelho, com brilho nos olhos. saudado como uma obra-prima enigmtica, uma
mensagem do grande alm. Aqui estava um
Mas salivar por uma lngua?. Voc no saliva por uma lngua, semelhana maravilhosa de um nu masculino
no ? olhando tristemente para o cu com uma confusa
CLARO QUE SIM!! e o coelho ficou to excitado que Sticky trepadeira de vinha por volta da cintura e
Whip saiu pelo seus olhos. (Mais sobre Sticky Whip cobrindo suas intimidades.
posteriormente em uma sidebar. No me deixem esquecer. Veja A esttua foi, por ltimo, vendida por cinqenta e
tambm: _O Compndio do Purista para novos Cremes para dois milhes de dlares e ficou em exibio
Retina, por Jory Patrick Sobgoblin, disponvel onde quer que permanente no museu do Louvre, com a placa:
vendam presilhas de animais.)
Nu Celeste por Annimo
Ok, voc me ganhou. Quero ouvir toda a histria, disse
Raposinho. Por favor, fale a vontade sobre o chamin. Ah, e
Dwemthy. Quem ele? Quais so suas motivaes? Ento talvez,
se eu ainda estiver por perto depois disso, voc poder me dizer
sobre o que faz os coelhos se motivarem, e talvez voc possa
segurar nossas mos atravs deste calvrio. Eu preciso de consolo
mais do que ningum. Provavelmente eu poderia usar religio
agora. Eu poderia usar sua bravura e este sentimento de realizao
que voc exala. Voc fuma cachimbo? Poderia ser uma ferramenta
proveitosa para trazermos nesta pontificao em que estamos
metidos.

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.

Terry Eagleton, After Theory, Londres, 2003, ch. 3.


Para todo efeito, voc pode dizer que programao, por si s, uma meta-linguagem. Todo cdigo fala a linguagem da
ao, de um plano que ainda no foi colocado em prtica, mas que brevemente ir. Instrues para o jogadores dentro
da sua mquina. Eu tenho um sentimento lacrado sobre este assunto.
Mas agora estamos avanando nossos estudos, nos aventurando em metaprogramao, mas no fique ansioso,
apenas o Ruby que voc j viu, a razo pela qual Dwemthy no hesitou em mostr-lo imediatamente a voc. Em
pouco tempo ser to fcil como perceber uma adio ou subtrao. primeira vista isto pode parecer brilhante, como
se voc tivesse encontrado seu primeiro vagalume, que de repente apareceu voando na sua frente. Ento, isto se torna
apenas uma pequenina luz cintilante que torna viver em Ohio muito mais legal.

Metaprogramao a escrita de cdigo que escreve cdigo. Mas


no como M. C. Escher rascunharia. O programa no fica Charadas dos Pezinhos
voltando e se escrevendo e nem o programa fica pulando de
seu monitor e arrancando o teclado de suas mos. No, bem Pergunta: Algum pode dar cinco mordidas em
menor que isso. um po e fazer a forma de uma bicicleta?
Resposta: Sim.
Vamos dizer que parecido com uma plula laranja que voc
ganhou no circo. Quando voc chupa ela e o sabor vai embora, Pergunta: Algum pode rasgar um po ao meio e
atrs do seu dente esconde um grande, esponjoso brontossauro. ele continuar entrando em um envelope?
Ele escorrega por sua lngua e pula livremente, brincando sobre as Resposta: Sim.
pastagem e gritando: Papai! E a partir desse momento, sempre Pergunta: Um homem pode pegar um po e
que ele enlouquecer vai atacar uma van, bem, essa van vai ficar arremessar enquanto outro homem senta-se sem
brilhante depois. po?
Agora, vamos dizer que algum coloque aquela pequena plula Resposta: Sim.
laranja debaixo da torneira. No na lngua, debaixo da torneira. Pergunta: Quatro pes em uma caixa podem ser
E isso aciona uma catalisao diferente, que cria um grupo de explicados?
sxtuplas esponjas choramingantes, com cordo umbilical e tudo Resposta: Sim.
mais. Ainda assim muito prtico para se limpar a van. Mas um Pergunta: Um erro de escritrio nos livros da
grupo totalmente diferente de camura. E, um dia, esses seis iro minha firma pode ser atribudo ao po?
fazer o papai chorar quando tocarem em um concerto de violino. Resposta: Sim.
Metaprogramao um conjunto de cdigo dentro de um formato Pergunta: Danarinos podem atravessar uma lona
de plula, que uma pequena gota de gua pode acionar para se de po?
expandir. Mais importante, voc pode controlar a reao da plula, Resposta: Sim.
de uma forma que o brontossauro pode ser criado magro e
desajeitado. Ou sxtuplos, CERTAMENTE, ou costureiras, ou Pergunta: Esses mesmo danarinos, quando
crebros de gato, ou drages. deparados com uma lona de po
class Dragao < Criatura
inexplicavelmente diferente, podem fracassar na
vida 1340 # escamas duras travessia?
forca 451 # veias ressaltadas Resposta: Sim.
carisma 1020 # sorridente
arma 939 # cospe fogo
Pergunta: Pes podem entender meus medos mais
end obscuros e meus sonhos mais selvagens?
Resposta: Sim.
Isso ainda no metaprogramao. Apenas a plula. O produto da Pergunta: Pes podem desejar-me?
metaprogramao. Estamos fazendo uma pausa, olhando para a Resposta: Sim.
besta antes de descer abaixo o seu tecido muscular com um bisturi
e um microscpio. Pergunta: Pes so invisveis para robs?
Resposta: Sim.
O Dragao uma classe. Voc j viu muitas vezes. O Dragao
descendente da classe Criatura. Pergunta: Um rob pode dar oito mordidas em
um po, sem saber que ele est l, e fazer a forma
Agora, olhe para cima. Preste ateno. A classe Criatura de um pequeno po?
contm o cdigo de metaprogramao. Voc pode escreve cdigo Resposta: Sim.
de metaprogramao que pode ser usado em qualquer lugar, ao
longo de todo Ruby, em Criatura ou Dragao, em String ou Pergunta: Meus clrigos devem ser equipados
em Object, qualquer lugar. O nosso exemplo aqui, uma vez que com pes?
Resposta: Sim.
esta a forma mais comum de meta-cdigo, foca em
metaprogramao dentro de classes apenas. Pergunta: Em relao aos pes, Os robs podem
ter cada um seus prprios elefantes?
Cada uma das caractersticas de Dragao so apenas mtodos de
Resposta: Sim.
classe. Voc tambm poderia escrever assim:
class Dragao < Criatura Pergunta: Algum pode partir um po ao meio e
vida( 1340 ) # escamas duras no deix-lo arruinar um jogo de domin?
forca( 451 ) # veias ressaltadas Resposta: Sim.
carisma( 1020 ) # sorridente
arma( 939 ) # cospe fogo Pergunta: Ns sempre amaremos os pes?
end Resposta: Sim.
Pergunta: Ns sempre comeremos mais pes?
Removendo os parnteses remove-se a confuso, ento vamos Resposta: Sim.
deixar sem. Apenas use parnteses quando estiver usando muitos
mtodos juntos e voc quer ser bem claro. Pergunta: Quatro pes podem se casar com um
elefante de um rob?
Resposta: Sim.
Cdigo da Criatura
Agora, com um corte lateral em todo o diafragma, nos mostraremos as entranhas da classe Criatura. Salve esse
cdigo em um arquivo chamado dwemthy.rb.
# As vsceras da fora vital do Array de Dwemthy
class Criatura

# Obtm uma metaclasse para esta classe


def self.metaclass; class << self; self; end; end

# Avanado cdigo de metaprogramao para boas


# e claras caractersticas
def self.caracteristicas( *arr )
return @caracteristicas if arr.empty?

# 1. Define 'accessors' para cada varivel


attr_accessor *arr

# 2. Adiciona um novo mtodo para cada caracterstica.


arr.each do |a|
metaclass.instance_eval do
define_method( a ) do |val|
@caracteristicas ||= {}
@caracteristicas[a] = val
end
end
end

# 3. Para cada monstro o mtodo 'initialize'


# deve usar um nmero padro para cada caracterstica.
class_eval do
define_method( :initialize ) do
self.class.caracteristicas.each do |k,v|
instance_variable_set("@#{k}", v)
end
end
end

end

# Os atributos da Criatura so somente leitura


caracteristicas :vida, :forca, :carisma, :arma
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

attr_reader :numeros_escolhidos, :data_compra

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

# 1. define mtodos leitores e escritores


attr_accessor :vida, :forca, :carisma, :arma

# 2. adiciona novos mtodos de classe para usar na criatura


def self.vida( val )
@caracteristicas ||= {}
@caracteristicas['vida'] = val
end

def self.forca( val )


@caracteristicas ||= {}
@caracteristicas['forca'] = val
end

def self.carisma( val )


@caracteristicas ||= {}
@caracteristicas['carisma'] = val
end

def self.arma( val )


@caracteristicas ||= {}
@caracteristicas['arma'] = val
end

# 3. estabelece pontos padres para


# cada caracterstica
def initialize
self.class.caracteristicas.each do |k,v|
instance_variable_set("@#{k}", v)
end
end

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.instance_variable_get( "@nome" )


=> "Tobias"

# O mtodo class_eval executa o cdigo se estiver dentro da definio de classe.


irb> Dragao.class_eval do
irb> def nome; @nome; end
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.

Bastante instruo depreciante e Ardilosa Justaposio Onde est o Array de Dwemthy??


V com cuidado aqui est a outra metade do ARRAY DE DWEMTHY!! Adicione essas linhas a
dwemthy.rb.
class Criatura
# Este mtodo aplica um golpe recebido durante uma luta.
def golpear( dano )
aumento_poder = rand( carisma )
if aumento_poder % 9 == 7
@vida += aumento_poder / 4
puts "[Aumento de poderes mgicos de #{ self.class } #{ aumento_poder }!]"
end
@vida -= dano
puts "[#{ self.class } est morto.]" if @vida <= 0
end

# Este mtodo obtm uma rodada em uma luta.


def lutar( inimigo, arma )
if vida <= 0
puts "[#{ self.class } est muito morto para lutar!]"
return
end

# 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

class ArrayDeDwemthy < Array


alias _inspect inspect
def inspect; "#<#{ self.class }#{ _inspect }>"; end
def method_missing( meth, *args )
resposta = first.send( meth, *args )
if first.vida <= 0
shift
if empty?
puts "[Uauu. Voc dizimou o Array de Dwemthy!]"
else
puts "[Prepare-se. #{ first.class } surgiu.]"
end
end
resposta || 0
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

Voc tem quarto armas. O bumerangue. A espada do heri. A alface. E as bombas.


Para fazer acontecer, abra o irb e carregue as bibliotecas que criamos acima.
irb> require 'dwemthy'
irb> require 'coelho'

Agora, mostre-se.
irb> c = Coelho.new
irb> c.vida
=> 10
irb> c.forca
=> 2

Bom, bom.

O Coelho Luta com a ScubaArgentina!


Voc no pode ir apressadamente para o Array de Dwemthy, sem cinto de segurana e simplesmente perfumado!!
Voc deve avanar deliberadamente para o demonaco cotilho. Ou ao sul, pelos bosques e pelo labirinto de carvo.
Neste momento, vamos nos esconder dissimuladamente pelo resduo leitoso ao lado dos aquedutos e seguir o
ScubaArgentina.
class ScubaArgentina < Criatura
vida 46
forca 35
carisma 91
arma 2
end

Para comear a luta, certifique-se de que criou um de voc e um do ScubaArgentina.


irb> c = Coelho.new
irb> s = ScubaArgentina.new

Agora use o bumeranguinho!


irb> c ^ s
[Voc golpeia com 2 pontos de dano!]
#<ScubaArgentina:0x808c864 @carisma=91, @forca=35, @vida=44, @arma=2>
[Seu inimigo golpeia com 28 pontos de dano!]
[O Coelho morreu.]

Por Cristo de Deus!! Nosso exemplar de coelho morreu!!

Duras perspectivas. Eu no posso te pedir para retornar ao reino


dos coelhos, no entanto, basta fingir como se voc no tivesse Os Sapatos Dos Quais As
morrido e fazer um novo coelho.
irb> r = Coelho.new
Mentiras So Feitas
Anteriormente, eu disse que O Meteoro
# atacando com bumerangue! Involuntrio era a nica histria que voc
irb> r ^ s
precisaria para saber para entender o pr-
# os golpes de espada do heri! eventualismo. Mas, realmente, tudo o que voc
irb> r / s precisa entender sobre pr-eventualismo que
ele ainda est em sua infncia e quaisquer dos
# comendo alface lhe d vida! seus conceitos mais bsicos podem mudar.
irb> r % s
Por isso que eu criei uma histria concorrente
# voc possui trs bombas! que eu acredito que revela um cenrio
irb> r * s intelectual totalmente diferente e muito
relevante.
Muito claro, voc no diria? O cdigo em coelho.rb modifica
alguns smbolos matemticos que trabalham somente com Havia um cara por a no bairro. E ele no era
Coelho. Ruby lhe permite alterar o comportamento dos muito velho, ento ele decidiu escrever a
operadores matemticos. Afinal, operadores matemticos so biografia da sua vida.
apenas mtodos! Bem, ele comeou a mentir em sua biografia.
# o bumerangue normalmente um operador XOR. Ele inventou algumas histrias. Mas na maioria
irb> 1.^( 1 ) pequenas histrias que eram inconseqentes.
=> 0 Encheo de lingia. Como a histria que ele
tinha sobre uma pintura que ele fez de um fundo
# a espada do heri normalmente divide nmeros.
irb> 10./( 2 )
vermelho com pernas de elefante na frente.
=> 5 Mas ele no tinha pintado nada disso. Depois ele
embelezou a histria falando sobre um leilo
# o alface d o resto da diviso.
irb> 10.%( 3 ) caro em que ele conseguiu entrar. Um leilo em
=> 1 Nova Iorque onde ele ouviu que sua pintura iria
ser vendida por vinte mil dlares. Mas esse no
# a bomba para multiplicao. o ponto da histria. O ponto era que ele podia
irb> 10.*( 3 ) dobrar seu corpo para caber dentro de um
=> 30
carrinho de comida. As pessoas levantariam a
tampa e nem o notariam l dentro. Ele nem
Quando faz sentido, voc pode optar por utilizar operadores
mencionou por qual preo sua pintura foi
matemticos em algumas de suas classes. Ruby usa esses
vendida.
operadores matemticos em muitas de suas prprias classes.
Arrays, por exemplo, tm uma poro de operadores matemticos Bem, ele realmente comeou a gostar daquela
que voc poder ver na lista de instncia dos mtodos quando voc histria (e outras como ela), at o ponto em que
digita: ri Array. ele comeou a ignorar seus amigos e famlia,
preferindo assistir ao que seu eu de mentira fez
depois do leilo. Na sua cabea.
# o operador mais combina dois arrays em um nico
array Ento, um dia ele estava fazendo compras e
irb> ["D", "W", "E"] + ["M", "T", "H", "Y"] encontrou um par de sapatos que tinha cadaros
=> ["D", "W", "E", "M", "T", "H", "Y"] listrados. E ele pegou os sapatos e foi ao caixa
da loja, forando-os na cara do funcionrio,
# menos remove todos os itens do segundo array
encontrados no primeiro
gritando, Olhe! Olhe para eles! Olhe! Esses so
irb> ["D", "W", "E", "M", "T", "H", "Y"] - ["W", os sapatos que meu eu de mentira usaria! E ele
"T"] comprou os sapatos e os colocou e toda a Terra
=> ["D", "E", "M", "H", "Y"] abriu e a caixa registradora abriu e o engoliu e
ele de repente estava em outro lugar, em seu
# o multiplicador repete os elementos de um array
apartamento de mentira, sentado para pintar
irb> ["D", "W"] * 3
=> ["D", "W", "D", "W", "D", "W"] bicos de golfinhos, trs deles num fundo verde.
Foi muito trabalho, pintar todos aqueles bicos. E
Voc deve estar se perguntando: afinal, o que isso significa para a ele quebrou por um tempo e teve que se rebaixar
matemtica? E se eu adicionar o nmero trs para um array? E se tanto quanto filmar a NASCAR do abominvel
eu adicionar uma string e um nmero? Como Ruby ir reagir? homem das neves.
Por favor, lembre-se, esses operadores so apenas mtodos. Mas,
uma vez que esses operadores no so palavras legveis, fica
difcil dizer o que eles fazem. Use o ri, muitas vezes voc ver
que os operadores so idnticos a outros mtodos legveis. Voc
pode optar por utilizar o operador ou o mtodo, o que for mais
claro para voc.
# divida com um mtodo operador ...
irb> 10 / 3
=> 3

# ... ou um mtodo legvel?


irb> 10.div 3
=> 3

Esta forma que a espada do coelho divide.

A Dura Realidade do Array de Dwemthy TE AGUARDA PARA LHE ESMAGAR !!


Depois que voc terminou de brincar de afogar o ltimo cara com o tubo de oxignio dele, hora de entrar No Array.
Eu duvido que voc possa fazer isso. Voc deixou sua machadinha em casa. Eu espero que voc no tenha usado todas
as suas bombas com o cara fcil.
Voc possui seis inimigos.
class MacacoIndustrialEntusiasmante < Criatura
vida 46
forca 35
carisma 91
arma 2
end

class AnjoDosAnoes < Criatura


vida 540
forca 6
carisma 144
arma 50
end

class TentaculoViceAssistenteEOmbudsman < Criatura


vida 320
forca 6
carisma 144
arma 50
end

class CervoDeDentes < Criatura


vida 655
forca 192
carisma 19
arma 109
end

class IntrepidoCiclistaDecomposto < Criatura


vida 901
forca 560
carisma 422
arma 105
end

class Dragao < Criatura


vida 1340 # escamas duras
forca 451 # veias ressaltadas
carisma 1020 # sorriso dentado
arma 939 # cospe fogo
end

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.

class ArrayDeDwemthy < Array


alias _inspect inspect
def inspect; "#<#{ self.class }#{ inspect }>"; end
def method_missing( meth, *args )
answer = first.send( meth, *args )
if first.vida <= 0
shift
if empty?
puts "[Uouuu. Voc dizimou o Array de Dwemthy!]"
else
puts "[Prepare-se. #{ first.class } surgiu.]"
end
end
answer || 0
end
end

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

irb> class FalsoCoelho < Coelho


irb> end

irb> Coelho.new "eu arrebentei a cara do drago!!"


=> #<Coelho diz 'eu arrebentei a cara do drago!!'>
irb> FalsoCoelho.new "Assim, assim e assim..."
=> #< FalsoCoelho diz 'Assim, assim e assim...'>

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

Veja! Veja! Aquele magrelinho method_missing passa a responsabilidade para outro!

4. Ento, Sejamos Claros: O Porco-Espinho Est Agora Rumo Ao Mar

5.

Caminhando, Caminhando, Caminhando, Caminhando e Assim por


Diante
A tardinha escureceu ao redor do par de raposos. Eles fizeram seu caminho atravs das vielas lotadas de gambs
cantantes, e ruas onde girafas em casacos esportivos passavam por eles batendo com suas maletas. Eles continuaram
caminhando.
E agora as lojas fechavam desenrolando suas portas de metal. Grilos cantavam das calhas e acotovelavam-se diante da
relaxante mudana.

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?!

Ah, qual ? Isto interessante. Mais foco.


Eu no vou aporrinhar ilustrando esta discusso que Blixy teve com os raposos neste momento! tudo um punhado

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.

Tirinha: Sapos que guardam acentos no nibus.


No podemos nos apertar para ir neste nibus disse Raposinho.
Pessoal, subam, disse Blix. O que est impedindo? Ah, os sapos. Sim, apenas se apertem. Blixy empurrou por
trs.
Ei, disse Raposo. Estou comprimido neste pequeno degrau! Algum se mexa!
Voc conseguiu jovem raposa?? disse o gato.
No, disse Raposinho, no pode ver? O motorista continua balanando a cabea e isso realmente me deixa nervoso.
Eu no acho que ele nos queira.
Vai, disse Blix. Desceu do seu degrau e andou pelo nibus, espreitando atravs das janelas de acrlico. Bem, eu no
sei pessoal. Eu no sei. Eu acho que tem muitos sapos. Ele bateu na janela. Ei! Mexam-se!
E esta a realidade de andar no trnsito intermunicipal em Wixl. terrivelmente competitivo. O nibus da manh
to cheio que a maioria dos animais de colarinho branco conseguem sapos para guardar seus lugares durante o perodo
da noite. Por qualquer razo, isto funciona. Se tornou mercadoria do fluxo de trabalho de sua economia.
Se voc consegue reunir um pouco de imaginao, pode ver um sinal de percentagem como um rosto inclinado de
um sapo. Visualizou a figura em sua cabea? Agora deixe-me mostrar os sapos que acampam em strings.
# O formato %s serve para posicionar strings cheias.
irb> "Assentos so ocupados por %s e %s." % ['um sapo', 'um sapo com dentes']
=> "Assentos so ocupados por um sapo e um sapo com dentes."

# O %d formato serve para colocar nmeros, enquanto o formato %f serve para


# floats (nmeros decimais).
irb> sapos = [44, 162.30]
irb> imediatamente = "Os sapos preencheram %d assentos e pagaram %f cristais azuis."
irb> imediatamente % sapos
=> "Os sapos preencheram 44 assentos e pagaram 162.30 cristais azuis."

# A formatao flexvel com tipos, voc pode transmitir em strings


# e format-los como nmeros.
irb> sapos = ['44', '162.30']
irb> imediatamente % sapos
=> "Os sapos preencheram 44 assentos e pagaram 162.30 cristais azuis."

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."

# D a um item justificado a esquerda 30 caracteres de largura


irb> "Na parte da frente do nibus: %-30s." % ['sapos']
=> "Na parte da frente 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.

E ento? Voc no acha que animais com tentculos podem


dirigir? Mais do Arrepiante
Bem, no s ele que vai se dar mal ao volante, mas ele tem todas
essas pernas em cima dos pedais. Isso no inteligente. Vamos Prenncio Progressivo dos
pegar outro nibus. Vamos l. Comedores de Cachecol
Voc sabe, ele provavelmente est sendo conduzido como todos os
dias. Ser que ele vai realmente comear a bater nesta fase da (do Captulo XII: Graas ao Cu pelo Pequeno
carreira dele? Homem.)
Os nibus batem, disse Raposinho. Alguns fazem. Isto cheira a Feche a porta, Spencer repetiu, mas a mo de
batida. Lara tremeu e ela negligentemente tateava o
Desvia ,merda! e Raposo gritou para o motorista, Ei, motorista, trinco. Seu pai no a ensinou a fechar portas
h quanto tempo voc dirige este nibus? como esta.
O motorista do nibus olhou misteriosamente por baixo da aba do Sim, esta uma porta incomum, disse Brent.
seu bon e comeou a virar-se em direo a eles, mas os seus Ele andou at l e fechou a porta para ela.
tentculos ficaram presos roda. Ele rapidamente sacudiu suas Ento, ele segurou as mos dela e olhou nos
pernas da frente e, falhando em solt-las, virou-se para a direo e seus olhos. Os olhos dele acenderam como
concentrou as suas energias em ordenhar de suas glndulas um enormes palitos de fsforos que seriam
pouco de timas secrees. Bolhas de muco gotejaram. enormes demais para ser prtico. Esta uma
Vamos cair fora daqui, disse Raposo e os dois correram para fora maaneta incomum, que assegura que aqueles
da rua, batendo direto no gato Blix. que no comem cachecis fiquem de fora.
Est bem, bem, o nibus est cheio, disse Blix. Eu no sei por Sentem-se, todos, ordenou Spencer, enquanto
que o motorista parou se ele sabia que o nibus estava cheio de delimitava seu espao atravs da sala e assumia
gafanhotos. o comando. Eu comando esta organizao,
declarou. A organizao secreta dos
Ns estamos pensando que ele estava prestes a bater contra ns,
Comedores de Cachecol!
disse Raposo, e ele abriu a porta para fazer parecer como uma
parada planejada. As tochas rodeando a sala queimavam como
Tenha em mente, Blix, ns no tnhamos realmente discutido essa invencveis fsforos enormes e o punhado de
adolescentes sentou-se. Exceto por Spencer que
possibilidade em voz alta, ento eu no tive uma chance para
concordar formalmente, disse Raposinho. No entanto, isto parece permaneceu em p alto e majestoso, aspirando
todo o oxignio na sala inteira em suas narinas
racional para mim.
antes de falar.
Eu estou pensando que todos os nibus vo estar cheios como
este. Blix mordeu seu lbio, pensando e piscando os olhos. Vamos Um de ns, ele disse, dramtica e
invencivelmente, est faltando!
apenas Ele apontou abaixo o circuito de edificaes de
apartamento que mudariam para o sul. Mas talvez Ele olhou A sala inteira se surpreendeu, que tambm
para cima e avaliou as estrelas, coando a cabea e contando as utilizou oxignio. A sala estava agitada.
constelaes com leves toques na pontas de seu dedo. Quem? Como? Quem foi? Ningum
sabia. Exceto por Spencer, que atravessou a
Voc est obtendo nossa orientao a partir das estrelas e
sala e tomou o controle.
planetas? perguntou Raposinho.
Nosso querido amigo Steve Bridell foi
Blix no falava, ele abaixou a cabea para o norte atravs de uma
roubado de ns, anunciou Spencer em uma
avenida uma avenida mal colocada voltar atrs da loja de tinta. Mas
voz ensurdecedoramente alta, como se milhares
antes que ns os sigamos em baixo nessa estrada de servio, cara
de palitos de fsforos gigantes fossem atirados
plida, Eu tenho mais um sapo para voc, empoleirados sobre uma
contra uma superfcie sensvel em harmonia no
longa vitria rgia que esticadas para fora para prender alguma coisa
meio de uma pilha de oxignio. Steve Bridell.
em tudo.
Algum de vocs conhece Steve Bridell?
irb> gato = "Blix"
irb> puts "O #{ gato } v o que esta rolando? Est o A sala estava em silncio.
#{ gato } prevenido??"
=> "O Blix v o que esta rolando? Est o Blix
Spencer continuou. Steve Bridell era um
prevenido??" recurso incrvel e todos de vocs o conheciam e
o amavam. Ele esculpiu este enorme homem de
Os pequenos sapos de anteriormente (%s ou %d) eram apenas madeira que usamos como pdio. Spencer
incgnitas para strings nicas. Guardando lugares na string. apontou. Ele tambm fez a srie de chocalhos
de madeira que est agora l atrs no nosso
As vitrias-rgia comeam com um broto de uma flor, a cerquilha armrio de instrumentos.
(sustenido ou jogo-da-velha). Voc tambm j o viu como um sinal
da libra em telefones. Depois dos brotos das flores, duas folhas Alguns da platia levantaram.
formam as bordas da vitria-rgia. As folhas so braos enrolados Espere, instruiu Spencer. No vo l traz.
(chaves), tambm vistas muitas vezes antes como (as garras do Eu j chequei. Os chocalhos se foram!
caranguejo) para um bloco de cdigo.
Uma vitria-rgia vazia "#{}" se torna uma string
vazia "".

Quando a vitria-rgia encontrada em uma string com aspas


duplas, Ruby executa algum cdigo encontrado entre as duas folhas
da vitria-rgia. A vitria-rgia erguida e o resultado do cdigo
colocado numa string. Esta troca da vitria-rgia chamada de
interpolao de string.
irb> companheiros = ['Blix', 'Raposo', 'Raposinho']
irb> puts "Deixe-nos seguir #{ companheiros.join ' e
' } em sua viagem."
=> "Deixe-nos seguir Blix e Raposo e Raposinho em
sua viagem."
A vitria-rgia muito estvel e pode armazenar qualquer tipo de
cdigo em seu interior. Acima estamos usando Array#join, mas
voc pode fazer qualquer coisa que queira. Chamar mtodos de
objeto, condicional de declaraes if ou case, at mesmo definir
classes.

irb> blix_foi = :norte


irb> puts "Blix no falou, ele curvou a cabea para o #{ blix_foi } voltando-se para #{
if blix_foi == :norte
'uma avenida mal colocada atrs da loja de tinta'
elsif blix_foi == :sul
'o circuito de edificaes de apartamento'
else
'... bem, quem sabe onde ele foi.'
end }. Mas antes que os sigamos..."
=> "Blix no falou, ele curvou a cabea para o norte voltando-se para uma avenida mal
colocada
atrs da loja de tinta. Mas antes que os sigamos..."

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.

irb> $0 # A varivel $0 o nome do arquivo do programa que est sendo rodado.


=> "irb" # Um zero pode ser considerado como o incio da contagem de nmeros.
# Esta varivel responde a seguinte questo, "Onde este programa comeou?"

irb> $* # A varivel $* contem todos os argumentos passados para um programa.


=> ['--prompt', 'simple']
# Este aqui fcil de se lembrar, se voc se lembrar que os mtodos Ruby
# tambm usam asteriscos para capturar argumentos em um array.

# O $! contem a exceo atual que foi levantada.


# A exclamao indica um estado de alerta. Uma exceo!
irb> begin
irb> raise TypeError, "No acredito nesta informao."
irb> rescue
irb> p $!
irb> end
=> #<TypeError: No acredito nesta informao.>

# O $@ contem o backtrace atual, caso uma exceo tenha sido provocada.


# O backtrace apresenta onde o Ruby _estava_ quando a exceo foi provocada.
irb> begin
irb> raise TypeError, "No acredito nesta informao."
irb> rescue
irb> p $@
irb> end
=> ["(irb):25:in `irb_binding'", "/usr/lib/ruby/1.8/irb/workspace.rb:52:in `irb_binding'",
"/usr/lib/ruby/1.8/irb/workspace.rb:52"]

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.

# A linha separadora controla como os mtodos each_line ou readlines quebram as strings.


irb> "Jeff,Jerry,Jill\nMichael,Mary,Myrtle".each_line { |nomes| p nomes }
=> "Jeff,Jerry,Jill\n"
=> "Michael,Mary,Myrtle"

# 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"

irb> $, # O $, a varivel que une o separador, usado ao unir strings com


=> nil # Array#join or Kernel::print. A vrgula um caractere comum de juno.

# O separador de juno est normalmente vazio.


irb> ['vela', 'sopa', 'mackarel'].join
=> "velasopamackarel"
irb> $, = ' * '; ['vela', 'sopa', 'mackarel'].join
=> "vela * sopa * mackarel"

# Mas, geralmente, voc no necessitar de uma varivel global.


irb> ['vela', 'sopa', 'mackarel'].join ' # '
=> "vela # sopa # mackarel"

irb> $; # O $; a varivel o separador que divide, usado ao dividir strings


=> nil # com String#split.

# 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"]

# Mas, geralmente, voc no necessitar de uma varivel global.


irb> "vela # sopa # mackarel".split ' # '
=> ['vela', 'sopa', 'mackarel']

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 (#).

Blixy sacudiu sua cabea. Oh, no.


Caramba! Minha mo est grvida, disse Raposo, vendo o pequeno embrio de raposa escorregando em sua mo.
Elas so boas frutas, apesar de tudo, disse Blix. O vinho que fazem destas frutinhas far nascer alguns olhos nos
seus dentes. Mas nada alm disso.
Ah, dor! gritou Raposinho, a medida que sua miniatura saia atravs dos poros de seu couro. Mas logo ele estava
ninando seu pequeno eu e murmurando canes de ninar. Nunca mais, nunca mais, cantava docemente o rouxinol. Luz
piscante das estrelas, dormindo tranqilo, enquanto empoleirado num pedao de Pltano.
Fazer duplicatas dos objetos Ruby no nada mais do que uma fruta de cdigo.e.
irb> arvore = [:fruta, :fruta, :fruta]
=> [:fruta, :fruta, :fruta]
irb> filhoarvore = arvore.clone
=> [:fruta, :fruta, :fruta]

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

Voc v a ilegvel linguagem de cervo no cdigo de exemplo? O


/^\w{8,15)$/ uma expresso regular. Se posso traduzi-la, a
regexp est dizendo,Por favor, permita somente letras, nmeros
ou travesses. No menos que oito e no mais que quinze.

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"

# Usando o objeto MatchData.


irb> telefone = /[(]\d{3}[)]\s*\d{3}-\d{4}/.match("O nmero (909) 375-4434")
=> #<MatchData:0xb7d51680>
irb> telefone.to_s
=> "(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"

irb> musica.gsub /\bmala\b/, 'viola'


=> "Eu furtei sua viola / E roubei o malabarista"

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

Estou Fora >

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.

No estou dizendo que minha vida


melhor que a sua. Eu simplesmente sinto
falta da minha irm. As coisas agora no
so mais como antigamente. Estamos
separados ou algo do tipo.
No sei. Estou confuso. Isto crescer?
Assistir a todas suas penas se soltarem?
E mesmo sabendo que algumas dessas
penas eram as melhores coisas que voc
possua?
Eu acho difcil dizer quem acabou com
tudo. Quem parou de amar quem? Eu
parei de me importar? Talvez eu s a
visse em duas dimenses e no fazia
questo de olhar os outros ngulos. Eu s
via planos. Ento ela deslizou no eixo z
enquanto eu no olhava e no fiz o dever
de casa para traar as coordenadas. Um
tronco em uma rvore geomtrica e eu insistindo em crculos.
Blix estava certo. Eu estou em tima forma para escrever este livro. Adeus at que eu possa cair fora daqui.
7.

Quando Voc Deseja Uma Barba


[0]
EI, ESTE CAPTULO FOI DEIXADO EM MEU COLO. EM BREVE EU TEREI ele PRONTO. EU TEREI.

Você também pode gostar