Você está na página 1de 61

Linguagem Ruby

Verso 1.0.0

Sumrio
I Sobre essa Apostila 2 4 9 18
19 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 20 20 20 20 20 20 21 21 21

II Informaes Bsicas III GNU Free Documentation License IV Linguagem Ruby

1 O que a Linguagem Ruby 2 Plano de ensino 2.1 Objetivo . . . 2.2 Pblico Alvo . 2.3 Pr-requisitos 2.4 Descrio . . 2.5 Metodologia . 2.6 Cronograma 2.7 Programa . . 2.8 Avaliao . . 2.9 Bibliograa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3 Introduo 22 3.1 Classes, Objetos e Mtodos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 3.2 Variaveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 3.3 Outro conceitos importantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 4 Instalao e Incio da Linguagem 24 4.1 Instalao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 4.2 Incio da Linguagem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 5 Conhecendo um pouco a linguagem 26 5.1 Variveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 5.2 Tipos Bsicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 6 Estruturas de Controle e Comentrios no Cdigo 40 6.1 Condicionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 6.1.1 If/Else . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 1

CDTC

Centro de Difuso de Tecnologia e Conhecimento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Brasil/DF . . . . . . . . . . . . . . . . . . 41 42 42 42 43 44

6.1.2 Case . . . . . . 6.2 Loops . . . . . . . . . 6.2.1 While . . . . . 6.2.2 for . . . . . . . 6.2.3 until . . . . . . 6.3 Comentando o Cdigo

7 Classes 45 7.1 Variveis de Instncia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 7.2 Variveis de Classe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 8 Entradas e Sadas 57 8.1 Fluxos de Entradas e Sadas Simples . . . . . . . . . . . . . . . . . . . . . . . . . . 57 8.2 Arquivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

Parte I

Sobre essa Apostila

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

Contedo
O contedo dessa apostila fruto da compilao de diversos materiais livres publicados na internet, disponveis em diversos sites ou originalmente produzido no CDTC (http://www.cdtc.org.br.) O formato original deste material bem como sua atualizao est disponvel dentro da licena GNU Free Documentation License, cujo teor integral encontra-se aqui reproduzido na seo de mesmo nome, tendo inclusive uma verso traduzida (no ocial). A reviso e alterao vem sendo realizada pelo CDTC (suporte@cdtc.org.br) desde outubro de 2006. Crticas e sugestes construtivas sero bem-vindas a qualquer hora.

Autores
A autoria deste de responsabilidade de Diego de Aquino Soares (diego@cdtc.org.br). O texto original faz parte do projeto Centro de Difuso de Tecnologia e Conhecimento que vm sendo realizado pelo ITI (Instituto Nacional de Tecnologia da Informao) em conjunto com outros parceiros institucionais, e com as universidades federais brasileiras que tem produzido e utilizado Software Livre apoiando inclusive a comunidade Free Software junto a outras entidades no pas. Informaes adicionais podem ser obtidas atravs do email ouvidoria@cdtc.org.br, ou da home page da entidade, atravs da URL http://www.cdtc.org.br.

Garantias
O material contido nesta apostila isento de garantias e o seu uso de inteira responsabilidade do usurio/leitor. Os autores, bem como o ITI e seus parceiros, no se responsabilizam direta ou indiretamente por qualquer prejuzo oriundo da utilizao do material aqui contido.

Licena
Copyright 2006, Instituto Nacional de Tecnologia da Informao (cdtc@iti.gov.br) . Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 or any later version published by the Free Software Foundation; with the Invariant Chapter being SOBRE ESSA APOSTILA. A copy of the license is included in the section entitled GNU Free Documentation License.

Parte II

Informaes Bsicas

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

Sobre o CDTC
Objetivo Geral O Projeto CDTC visa a promoo e o desenvolvimento de aes que incentivem a disseminao de solues que utilizem padres abertos e no proprietrios de tecnologia, em proveito do desenvolvimento social, cultural, poltico, tecnolgico e econmico da sociedade brasileira. Objetivo Especco Auxiliar o Governo Federal na implantao do plano nacional de software no-proprietrio e de cdigo fonte aberto, identicando e mobilizando grupos de formadores de opinio dentre os servidores pblicos e agentes polticos da Unio Federal, estimulando e incentivando o mercado nacional a adotar novos modelos de negcio da tecnologia da informao e de novos negcios de comunicao com base em software no-proprietrio e de cdigo fonte aberto, oferecendo treinamento especco para tcnicos, prossionais de suporte e funcionrios pblicos usurios, criando grupos de funcionrios pblicos que iro treinar outros funcionrios pblicos e atuar como incentivadores e defensores dos produtos de software no proprietrios e cdigo fonte aberto, oferecendo contedo tcnico on-line para servios de suporte, ferramentas para desenvolvimento de produtos de software no proprietrios e do seu cdigo fonte livre, articulando redes de terceiros (dentro e fora do governo) fornecedoras de educao, pesquisa, desenvolvimento e teste de produtos de software livre.

Guia do aluno
Neste guia, voc ter reunidas uma srie de informaes importantes para que voc comece seu curso. So elas: Licenas para cpia de material disponvel; Os 10 mandamentos do aluno de Educao a Distncia; Como participar dos foruns e da wikipdia; Primeiros passos. muito importante que voc entre em contato com TODAS estas informaes, seguindo o roteiro acima.

Licena
Copyright 2006, Instituto Nacional de Tecnologia da Informao (cdtc@iti.gov.br). 6

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

dada permisso para copiar, distribuir e/ou modicar este documento sob os termos da Licena de Documentao Livre GNU, Verso 1.1 ou qualquer verso posterior pblicada pela Free Software Foundation; com o Capitulo Invariante SOBRE ESSA APOSTILA. Uma cpia da licena est inclusa na seo entitulada "Licena de Documentao Livre GNU".

Os 10 mandamentos do aluno de educao online

1. Acesso Internet: ter endereo eletrnico, um provedor e um equipamento adequado pr-requisito para a participao nos cursos a distncia; 2. Habilidade e disposio para operar programas: ter conhecimentos bsicos de Informtica necessrio para poder executar as tarefas; 3. Vontade para aprender colaborativamente: interagir, ser participativo no ensino a distncia conta muitos pontos, pois ir colaborar para o processo ensino-aprendizagem pessoal, dos colegas e dos professores; 4. Comportamentos compatveis com a etiqueta: mostrar-se interessado em conhecer seus colegas de turma respeitando-os e se fazendo ser respeitado pelos mesmos; 5. Organizao pessoal: planejar e organizar tudo fundamental para facilitar a sua reviso e a sua recuperao de materiais; 6. Vontade para realizar as atividades no tempo correto: anotar todas as suas obrigaes e realiz-las em tempo real; 7. Curiosidade e abertura para inovaes: aceitar novas idias e inovar sempre; 8. Flexibilidade e adaptao: requisitos necessrio mudana tecnolgica, aprendizagens e descobertas; 9. Objetividade em sua comunicao: comunicar-se de forma clara, breve e transparente ponto - chave na comunicao pela Internet; 10. Responsabilidade: ser responsvel por seu prprio aprendizado. O ambiente virtual no controla a sua dedicao, mas reete os resultados do seu esforo e da sua colaborao.

Como participar dos fruns e Wikipdia


Voc tem um problema e precisa de ajuda? Podemos te ajudar de 2 formas: A primeira o uso dos fruns de notcias e de dvidas gerais que se distinguem pelo uso: . O frum de notcias tem por objetivo disponibilizar um meio de acesso rpido a informaes que sejam pertinentes ao curso (avisos, notcias). As mensagens postadas nele so enviadas a 7

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

todos participantes. Assim, se o monitor ou algum outro participante tiver uma informao que interesse ao grupo, favor post-la aqui. Porm, se o que voc deseja resolver alguma dvida ou discutir algum tpico especco do curso. recomendado que voc faa uso do Frum de dvidas gerais que lhe d recursos mais efetivos para esta prtica. . O frum de dvidas gerais tem por objetivo disponibilizar um meio fcil, rpido e interativo para solucionar suas dvidas e trocar experincias. As mensagens postadas nele so enviadas a todos participantes do curso. Assim, ca muito mais fcil obter respostas, j que todos podem ajudar. Se voc receber uma mensagem com algum tpico que saiba responder, no se preocupe com a formalizao ou a gramtica. Responda! E no se esquea de que antes de abrir um novo tpico recomendvel ver se a sua pergunta j foi feita por outro participante. A segunda forma se d pelas Wikis: . Uma wiki uma pgina web que pode ser editada colaborativamente, ou seja, qualquer participante pode inserir, editar, apagar textos. As verses antigas vo sendo arquivadas e podem ser recuperadas a qualquer momento que um dos participantes o desejar. Assim, ela oferece um timo suporte a processos de aprendizagem colaborativa. A maior wiki na web o site "Wikipdia", uma experincia grandiosa de construo de uma enciclopdia de forma colaborativa, por pessoas de todas as partes do mundo. Acesse-a em portugus pelos links: Pgina principal da Wiki - http://pt.wikipedia.org/wiki/ Agradecemos antecipadamente a sua colaborao com a aprendizagem do grupo!

Primeiros Passos
Para uma melhor aprendizagem recomendvel que voc siga os seguintes passos: Ler o Plano de Ensino e entender a que seu curso se dispe a ensinar; Ler a Ambientao do Moodle para aprender a navegar neste ambiente e se utilizar das ferramentas bsicas do mesmo; Entrar nas lies seguindo a seqncia descrita no Plano de Ensino; Qualquer dvida, reporte ao Frum de Dvidas Gerais.

Perl do Tutor
Segue-se uma descrio do tutor ideal, baseada no feedback de alunos e de tutores. O tutor ideal um modelo de excelncia: consistente, justo e prossional nos respectivos valores e atitudes, incentiva mas honesto, imparcial, amvel, positivo, respeitador, aceita as idias dos estudantes, paciente, pessoal, tolerante, apreciativo, compreensivo e pronto a ajudar. 8

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

A classicao por um tutor desta natureza proporciona o melhor feedback possvel, crucial, e, para a maior parte dos alunos, constitui o ponto central do processo de aprendizagem. Este tutor ou instrutor: fornece explicaes claras acerca do que ele espera e do estilo de classicao que ir utilizar; gosta que lhe faam perguntas adicionais; identica as nossas falhas, mas corrige-as amavelmente, diz um estudante, e explica porque motivo a classicao foi ou no foi atribuda; tece comentrios completos e construtivos, mas de forma agradvel (em contraste com um reparo de um estudante: os comentrios deixam-nos com uma sensao de crtica, de ameaa e de nervossismo) d uma ajuda complementar para encorajar um estudante em diculdade; esclarece pontos que no foram entendidos, ou corretamente aprendidos anteriormente; ajuda o estudante a alcanar os seus objetivos; exvel quando necessrio; mostra um interesse genuno em motivar os alunos (mesmo os principiantes e, por isso, talvez numa fase menos interessante para o tutor); escreve todas as correes de forma legvel e com um nvel de pormenorizao adequado; acima de tudo, devolve os trabalhos rapidamente;

Parte III

GNU Free Documentation License

10

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

(Traduzido pelo Joo S. O. Bueno atravs do CIPSGA em 2001) Esta uma traduo no ocial da Licena de Documentao Livre GNU em Portugus Brasileiro. Ela no publicada pela Free Software Foundation, e no se aplica legalmente a distribuio de textos que usem a GFDL - apenas o texto original em Ingls da GNU FDL faz isso. Entretanto, ns esperamos que esta traduo ajude falantes de portugus a entenderem melhor a GFDL. This is an unofcial translation of the GNU General Documentation License into Brazilian Portuguese. It was not published by the Free Software Foundation, and does not legally state the distribution terms for software that uses the GFDLonly the original English text of the GFDL does that. However, we hope that this translation will help Portuguese speakers understand the GFDL better. Licena de Documentao Livre GNU Verso 1.1, Maro de 2000 Copyright (C) 2000 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA permitido a qualquer um copiar e distribuir cpias exatas deste documento de licena, mas no permitido alter-lo.

INTRODUO
O propsito desta Licena deixar um manual, livro-texto ou outro documento escrito "livre"no sentido de liberdade: assegurar a qualquer um a efetiva liberdade de copi-lo ou redistribui-lo, com ou sem modicaes, comercialmente ou no. Secundariamente, esta Licena mantm para o autor e editor uma forma de ter crdito por seu trabalho, sem ser considerado responsvel pelas modicaes feitas por terceiros. Esta Licena um tipo de "copyleft"("direitos revertidos"), o que signica que derivaes do documento precisam ser livres no mesmo sentido. Ela complementa a GNU Licena Pblica Geral (GNU GPL), que um copyleft para software livre. Ns zemos esta Licena para que seja usada em manuais de software livre, por que software livre precisa de documentao livre: um programa livre deve ser acompanhado de manuais que provenham as mesmas liberdades que o software possui. Mas esta Licena no est restrita a manuais de software; ela pode ser usada para qualquer trabalho em texto, independentemente do assunto ou se ele publicado como um livro impresso. Ns recomendamos esta Licena principalmente para trabalhos cujo propsito seja de introduo ou referncia.

APLICABILIDADE E DEFINIES
Esta Licena se aplica a qualquer manual ou outro texto que contenha uma nota colocada pelo detentor dos direitos autorais dizendo que ele pode ser distribudo sob os termos desta Licena. O "Documento"abaixo se refere a qualquer manual ou texto. Qualquer pessoa do pblico um

11

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

licenciado e referida como "voc". Uma "Verso Modicada"do Documento se refere a qualquer trabalho contendo o documento ou uma parte dele, quer copiada exatamente, quer com modicaes e/ou traduzida em outra lngua. Uma "Seo Secundria" um apndice ou uma seo inicial do Documento que trata exclusivamente da relao dos editores ou dos autores do Documento com o assunto geral do Documento (ou assuntos relacionados) e no contm nada que poderia ser includo diretamente nesse assunto geral (Por exemplo, se o Documento em parte um livro texto de matemtica, a Seo Secundria pode no explicar nada de matemtica). Essa relao poderia ser uma questo de ligao histrica com o assunto, ou matrias relacionadas, ou de posies legais, comerciais, loscas, ticas ou polticas relacionadas ao mesmo. As "Sees Invariantes"so certas Sees Secundrias cujos ttulos so designados, como sendo de Sees Invariantes, na nota que diz que o Documento publicado sob esta Licena. Os "Textos de Capa"so certos trechos curtos de texto que so listados, como Textos de Capa Frontal ou Textos da Quarta Capa, na nota que diz que o texto publicado sob esta Licena. Uma cpia "Transparente"do Documento signica uma cpia que pode ser lida automaticamente, representada num formato cuja especicao esteja disponvel ao pblico geral, cujos contedos possam ser vistos e editados diretamente e sem mecanismos especiais com editores de texto genricos ou (para imagens compostas de pixels) programas de pintura genricos ou (para desenhos) por algum editor de desenhos grandemente difundido, e que seja passvel de servir como entrada a formatadores de texto ou para traduo automtica para uma variedade de formatos que sirvam de entrada para formatadores de texto. Uma cpia feita em um formato de arquivo outrossim Transparente cuja constituio tenha sido projetada para atrapalhar ou desencorajar modicaes subsequentes pelos leitores no Transparente. Uma cpia que no "Transparente" chamada de "Opaca". Exemplos de formatos que podem ser usados para cpias Transparentes incluem ASCII simples sem marcaes, formato de entrada do Texinfo, formato de entrada do LaTex, SGML ou XML usando uma DTD disponibilizada publicamente, e HTML simples, compatvel com os padres, e projetado para ser modicado por pessoas. Formatos opacos incluem PostScript, PDF, formatos proprietrios que podem ser lidos e editados apenas com processadores de texto proprietrios, SGML ou XML para os quais a DTD e/ou ferramentas de processamento e edio no estejam disponveis para o pblico, e HTML gerado automaticamente por alguns editores de texto com nalidade apenas de sada. A "Pgina do Ttulo"signica, para um livro impresso, a pgina do ttulo propriamente dita, mais quaisquer pginas subsequentes quantas forem necessrias para conter, de forma legvel, o material que esta Licena requer que aparea na pgina do ttulo. Para trabalhos que no tenham uma pgina do ttulo, "Pgina do Ttulo"signica o texto prximo da apario mais proeminente do ttulo do trabalho, precedendo o incio do corpo do texto.

12

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

FAZENDO CPIAS EXATAS


Voc pode copiar e distribuir o Documento em qualquer meio, de forma comercial ou no comercial, desde que esta Licena, as notas de copyright, e a nota de licena dizendo que esta Licena se aplica ao documento estejam reproduzidas em todas as cpias, e que voc no acrescente nenhuma outra condio, quaisquer que sejam, s desta Licena. Voc no pode usar medidas tcnicas para obstruir ou controlar a leitura ou confeco de cpias subsequentes das cpias que voc zer ou distribuir. Entretanto, voc pode aceitar compensao em troca de cpias. Se voc distribuir uma quantidade grande o suciente de cpias, voc tambm precisa respeitar as condies da seo 3. Voc tambm pode emprestar cpias, sob as mesmas condies colocadas acima, e tambm pode exibir cpias publicamente.

FAZENDO CPIAS EM QUANTIDADE


Se voc publicar cpias do Documento em nmero maior que 100, e a nota de licena do Documento obrigar Textos de Capa, voc precisar incluir as cpias em capas que tragam, clara e legivelmente, todos esses Textos de Capa: Textos de Capa da Frente na capa da frente, e Textos da Quarta Capa na capa de trs. Ambas as capas tambm precisam identicar clara e legivelmente voc como o editor dessas cpias. A capa da frente precisa apresentar o ttulo completo com todas as palavras do ttulo igualmente proeminentes e visveis. Voc pode adicionar outros materiais s capas. Fazer cpias com modicaes limitadas s capas, tanto quanto estas preservem o ttulo do documento e satisfaam a essas condies, pode ser tratado como cpia exata em outros aspectos. Se os textos requeridos em qualquer das capas for muito volumoso para caber de forma legvel, voc deve colocar os primeiros (tantos quantos couberem de forma razovel) na capa verdadeira, e continuar os outros nas pginas adjacentes. Se voc publicar ou distribuir cpias Opacas do Documento em nmero maior que 100, voc precisa ou incluir uma cpia Transparente que possa ser lida automaticamente com cada cpia Opaca, ou informar, em ou com, cada cpia Opaca a localizao de uma cpia Transparente completa do Documento acessvel publicamente em uma rede de computadores, qual o pblico usurio de redes tenha acesso a download gratuito e annimo utilizando padres pblicos de protocolos de rede. Se voc utilizar o segundo mtodo, voc precisar tomar cuidados razoavelmente prudentes, quando iniciar a distribuio de cpias Opacas em quantidade, para assegurar que esta cpia Transparente vai permanecer acessvel desta forma na localizao especicada por pelo menos um ano depois da ltima vez em que voc distribuir uma cpia Opaca (diretamente ou atravs de seus agentes ou distribuidores) daquela edio para o pblico. pedido, mas no obrigatrio, que voc contate os autores do Documento bem antes de redistribuir qualquer grande nmero de cpias, para lhes dar uma oportunidade de prover voc com uma verso atualizada do Documento.

13

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

MODIFICAES
Voc pode copiar e distribuir uma Verso Modicada do Documento sob as condies das sees 2 e 3 acima, desde que voc publique a Verso Modicada estritamente sob esta Licena, com a Verso Modicada tomando o papel do Documento, de forma a licenciar a distribuio e modicao da Verso Modicada para quem quer que possua uma cpia da mesma. Alm disso, voc precisa fazer o seguinte na verso modicada: A. Usar na Pgina de Ttulo (e nas capas, se houver alguma) um ttulo distinto daquele do Documento, e daqueles de verses anteriores (que deveriam, se houvesse algum, estarem listados na seo "Histrico do Documento"). Voc pode usar o mesmo ttulo de uma verso anterior se o editor original daquela verso lhe der permisso; B. Listar na Pgina de Ttulo, como autores, uma ou mais das pessoas ou entidades responsveis pela autoria das modicaes na Verso Modicada, conjuntamente com pelo menos cinco dos autores principais do Documento (todos os seus autores principais, se ele tiver menos que cinco); C. Colocar na Pgina de Ttulo o nome do editor da Verso Modicada, como o editor; D. Preservar todas as notas de copyright do Documento; E. Adicionar uma nota de copyright apropriada para suas prprias modicaes adjacente s outras notas de copyright; F. Incluir, imediatamente depois das notas de copyright, uma nota de licena dando ao pblico o direito de usar a Verso Modicada sob os termos desta Licena, na forma mostrada no tpico abaixo; G. Preservar nessa nota de licena as listas completas das Sees Invariantes e os Textos de Capa requeridos dados na nota de licena do Documento; H. Incluir uma cpia inalterada desta Licena; I. Preservar a seo entitulada "Histrico", e seu ttulo, e adicionar mesma um item dizendo pelo menos o ttulo, ano, novos autores e editor da Verso Modicada como dados na Pgina de Ttulo. Se no houver uma sesso denominada "Histrico"no Documento, criar uma dizendo o ttulo, ano, autores, e editor do Documento como dados em sua Pgina de Ttulo, ento adicionar um item descrevendo a Verso Modicada, tal como descrito na sentena anterior; J. Preservar o endereo de rede, se algum, dado no Documento para acesso pblico a uma cpia Transparente do Documento, e da mesma forma, as localizaes de rede dadas no Documento para as verses anteriores em que ele foi baseado. Elas podem ser colocadas na seo "Histrico". Voc pode omitir uma localizao na rede para um trabalho que tenha sido publicado pelo menos quatro anos antes do Documento, ou se o editor original da verso a que ela se rera der sua permisso; K. Em qualquer seo entitulada "Agradecimentos"ou "Dedicatrias", preservar o ttulo da 14

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

seo e preservar a seo em toda substncia e m de cada um dos agradecimentos de contribuidores e/ou dedicatrias dados; L. Preservar todas as Sees Invariantes do Documento, inalteradas em seus textos ou em seus ttulos. Nmeros de seo ou equivalentes no so considerados parte dos ttulos da seo; M. Apagar qualquer seo entitulada "Endossos". Tal sesso no pode ser includa na Verso Modicada; N. No reentitular qualquer seo existente com o ttulo "Endossos"ou com qualquer outro ttulo dado a uma Seo Invariante. Se a Verso Modicada incluir novas sees iniciais ou apndices que se qualiquem como Sees Secundrias e no contenham nenhum material copiado do Documento, voc pode optar por designar alguma ou todas aquelas sees como invariantes. Para fazer isso, adicione seus ttulos lista de Sees Invariantes na nota de licena da Verso Modicada. Esses ttulos precisam ser diferentes de qualquer outro ttulo de seo. Voc pode adicionar uma seo entitulada "Endossos", desde que ela no contenha qualquer coisa alm de endossos da sua Verso Modicada por vrias pessoas ou entidades - por exemplo, declaraes de revisores ou de que o texto foi aprovado por uma organizao como a denio ocial de um padro. Voc pode adicionar uma passagem de at cinco palavras como um Texto de Capa da Frente , e uma passagem de at 25 palavras como um Texto de Quarta Capa, ao nal da lista de Textos de Capa na Verso Modicada. Somente uma passagem de Texto da Capa da Frente e uma de Texto da Quarta Capa podem ser adicionados por (ou por acordos feitos por) qualquer entidade. Se o Documento j incluir um texto de capa para a mesma capa, adicionado previamente por voc ou por acordo feito com alguma entidade para a qual voc esteja agindo, voc no pode adicionar um outro; mas voc pode trocar o antigo, com permisso explcita do editor anterior que adicionou a passagem antiga. O(s) autor(es) e editor(es) do Documento no do permisso por esta Licena para que seus nomes sejam usados para publicidade ou para assegurar ou implicar endossamento de qualquer Verso Modicada.

COMBINANDO DOCUMENTOS
Voc pode combinar o Documento com outros documentos publicados sob esta Licena, sob os termos denidos na seo 4 acima para verses modicadas, desde que voc inclua na combinao todas as Sees Invariantes de todos os documentos originais, sem modicaes, e liste todas elas como Sees Invariantes de seu trabalho combinado em sua nota de licena. O trabalho combinado precisa conter apenas uma cpia desta Licena, e Sees Invariantes Idnticas com multiplas ocorrncias podem ser substitudas por apenas uma cpia. Se houver mltiplas Sees Invariantes com o mesmo nome mas com contedos distintos, faa o ttulo de 15

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

cada seo nico adicionando ao nal do mesmo, em parnteses, o nome do autor ou editor origianl daquela seo, se for conhecido, ou um nmero que seja nico. Faa o mesmo ajuste nos ttulos de seo na lista de Sees Invariantes nota de licena do trabalho combinado. Na combinao, voc precisa combinar quaisquer sees entituladas "Histrico"dos diversos documentos originais, formando uma seo entitulada "Histrico"; da mesma forma combine quaisquer sees entituladas "Agradecimentos", ou "Dedicatrias". Voc precisa apagar todas as sees entituladas como "Endosso".

COLETNEAS DE DOCUMENTOS
Voc pode fazer uma coletnea consitindo do Documento e outros documentos publicados sob esta Licena, e substituir as cpias individuais desta Licena nos vrios documentos com uma nica cpia incluida na coletnea, desde que voc siga as regras desta Licena para cpia exata de cada um dos Documentos em todos os outros aspectos. Voc pode extrair um nico documento de tal coletnea, e distribu-lo individualmente sob esta Licena, desde que voc insira uma cpia desta Licena no documento extrado, e siga esta Licena em todos os outros aspectos relacionados cpia exata daquele documento.

AGREGAO COM TRABALHOS INDEPENDENTES


Uma compilao do Documento ou derivados dele com outros trabalhos ou documentos separados e independentes, em um volume ou mdia de distribuio, no conta como uma Verso Modicada do Documento, desde que nenhum copyright de compilao seja reclamado pela compilao. Tal compilao chamada um "agregado", e esta Licena no se aplica aos outros trabalhos auto-contidos compilados junto com o Documento, s por conta de terem sido assim compilados, e eles no so trabalhos derivados do Documento. Se o requerido para o Texto de Capa na seo 3 for aplicvel a essas cpias do Documento, ento, se o Documento constituir menos de um quarto de todo o agregado, os Textos de Capa do Documento podem ser colocados em capas adjacentes ao Documento dentro do agregado. Seno eles precisaro aparecer nas capas de todo o agregado.

TRADUO
Traduo considerada como um tipo de modicao, ento voc pode distribuir tradues do Documento sob os termos da seo 4. A substituio de Sees Invariantes por tradues requer uma permisso especial dos detentores do copyright das mesmas, mas voc pode incluir tradues de algumas ou de todas as Sees Invariantes em adio s verses orignais dessas Sees Invariantes. Voc pode incluir uma traduo desta Licena desde que voc tambm inclua a verso original em Ingls desta Licena. No caso de discordncia entre a traduo e a

16

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

verso original em Ingls desta Licena, a verso original em Ingls prevalecer.

TRMINO
Voc no pode copiar, modicar, sublicenciar, ou distribuir o Documento exceto como expressamente especicado sob esta Licena. Qualquer outra tentativa de copiar, modicar, sublicenciar, ou distribuir o Documento nula, e resultar automaticamente no trmino de seus direitos sob esta Licena. Entretanto, terceiros que tenham recebido cpias, ou direitos de voc sob esta Licena no tero suas licenas terminadas, tanto quanto esses terceiros permaneam em total acordo com esta Licena.

REVISES FUTURAS DESTA LICENA


A Free Software Foundation pode publicar novas verses revisadas da Licena de Documentao Livre GNU de tempos em tempos. Tais novas verses sero similares em espirito verso presente, mas podem diferir em detalhes ao abordarem novos porblemas e preocupaes. Veja http://www.gnu.org/copyleft/. A cada verso da Licena dado um nmero de verso distinto. Se o Documento especicar que uma verso particular desta Licena "ou qualquer verso posterior"se aplica ao mesmo, voc tem a opo de seguir os termos e condies daquela verso especca, ou de qualquer verso posterior que tenha sido publicada (no como rascunho) pela Free Software Foundation. Se o Documento no especicar um nmero de Verso desta Licena, voc pode escolher qualquer verso j publicada (no como rascunho) pela Free Software Foundation. ADENDO: Como usar esta Licena para seus documentos Para usar esta Licena num documento que voc escreveu, inclua uma cpia desta Licena no documento e ponha as seguintes notas de copyright e licenas logo aps a pgina de ttulo: Copyright (c) ANO SEU NOME. dada permisso para copiar, distribuir e/ou modicar este documento sob os termos da Licena de Documentao Livre GNU, Verso 1.1 ou qualquer verso posterior publicada pela Free Software Foundation; com as Sees Invariantes sendo LISTE SEUS TTULOS, com os Textos da Capa da Frente sendo LISTE, e com os Textos da Quarta-Capa sendo LISTE. Uma cpia da licena est inclusa na seo entitulada "Licena de Documentao Livre GNU". Se voc no tiver nenhuma Seo Invariante, escreva "sem Sees Invariantes"ao invs de dizer quais so invariantes. Se voc no tiver Textos de Capa da Frente, escreva "sem Textos de Capa da Frente"ao invs de "com os Textos de Capa da Frente sendo LISTE"; o mesmo para os Textos da Quarta Capa. Se o seu documento contiver exemplos no triviais de cdigo de programas, ns recomendamos a publicao desses exemplos em paralelo sob a sua escolha de licena de software livre,

17

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

tal como a GNU General Public License, para permitir o seu uso em software livre.

18

Parte IV

Linguagem Ruby

19

Captulo 1

O que a Linguagem Ruby


A linguagem de programao Ruby, foi criada visando os interesses do programador. Tal linguagem tem diversas funcionalidades que facilitam na hora da programao. Isso faz com que o programador no tenha que se preocupar com coisas, que a prpria linguagem capaz de fazer. Isso pode no parecer to claro. Mas no decorrer do curso, voc ver como til a linguagem Ruby.

20

Captulo 2

Plano de ensino
2.1 Objetivo
Qualicar tcnicos e programadores na linguagem de programao Ruby

2.2 Pblico Alvo


Tcnicos e Programadores que desejam trabalhar com Linguagem Ruby

2.3 Pr-requisitos
Os usurios devero ser, necessariamente, indicados por empresas pblicas e ter conhecimento bsico acerca da lgica de programao.

2.4 Descrio
O curso de Linguagem Ruby ser realizado na modalidade EAD e utilizar a plataforma Moodle como ferramenta de aprendizagem. Ele composto de um mdulo de aprendizado que consiste em introduo, instalao e incio, um mdulo de contatos com a linguagem e um mdulo de conceitos nais e avaliao que ser dado na terceira semana. O material didtico estar disponvel on-line de acordo com as datas pr-estabelecidas no calendrio. A verso utilizada para o Ruby ser a 1.8

2.5 Metodologia
O curso est dividido da seguinte maneira:

2.6 Cronograma
Introduo, Instalao e Inicio;

21

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

Conhecendo um pouco da linguagem, estruturas de controle e comentrios do cdigo e Noes de POO; Classes, entradas e sadas. As lies contm o contedo principal. Elas podero ser acessadas quantas vezes forem necessrias, desde que esteja dentro da semana programada. Ao nal de uma lio, voc receber uma nota de acordo com o seu desempenho. Responda com ateno s perguntas de cada lio, pois elas sero consideradas na sua nota nal. Caso sua nota numa determinada lio seja menor do que 6.0, sugerimos que voc faa novamente esta lio. Ao nal do curso ser disponibilizada a avaliao referente ao curso. Tanto as notas das lies quanto a da avaliao sero consideradas para a nota nal. Todos os mdulos caro visveis para que possam ser consultados durante a avaliao nal. Aconselhamos a leitura da "Ambientao do Moodle"para que voc conhea a plataforma de Ensino Distncia, evitando diculdades advindas do "desconhecimento"sobre a mesma. Os instrutores estaro sua disposio ao longo de todo curso. Qualquer dvida dever ser enviada ao frum. Diariamente os monitores daro respostas e esclarecimentos.

2.7 Programa
O curso de Linguagem Ruby oferecer o seguinte contedo: Introduo e Instalao; Uso das ferramentas mais comuns.

2.8 Avaliao
Toda a avaliao ser feita on-line. Aspectos a serem considerados na avaliao: Iniciativa e autonomia no processo de aprendizagem e de produo de conhecimento; Capacidade de pesquisa e abordagem criativa na soluo dos problemas apresentados. Instrumentos de avaliao: Participao ativa nas atividades programadas; Avaliao ao nal do curso; O participante far vrias avaliaes referente ao contedo do curso. Para a aprovao e obteno do certicado o participante dever obter nota nal maior ou igual a 6.0 de acordo com a frmula abaixo: Nota Final = ((ML x 7) + (AF x 3)) / 10 = Mdia aritmtica das lies; AF = Avaliaes.

2.9 Bibliograa
Site ofcial: http://www.ruby-lang.org 22

Captulo 3

Introduo
Ruby uma linguagem de programao com uma tipagem dinmica, mas forte. Possui grande semelhana com Perl e Python. Teve como criador o programador Yukihiro Matsumoto, tambm conhecido como Matz, na internet. Ao cri-la, Matz estava com a seguinte idia: Criar uma linguagem mais orientada a objetos do que Python e mais poderosa que Perl. Foi projetada tanto para uma codicao rpida quanto para uma programao em grande escala e possui um suporte de orientao a objetos simples e prtico, com uma sintaxe que facilita leitura e simplica a escrita do cdigo. Matz acreditava que o programador deveria se divertir ao realizar determinada tarefa, logo pensou justamente nisso para criar o Ruby. Vem sendo bastante utilizada pelo mundo e com uma lista de discusso bastante ativa, conhecida como ruby-talk. Vem tambm sendo erguida para uma linguagem de primeiro nvel atravs do RubyOnRails. Diferente de Java e C++, linguagens tambm orientadas a objetos, o tipo de objeto em Ruby s conhecido em runtime. Sua orientao a objetos pura, ou seja, tudo objeto, at mesmo os tipos mais bsicos de variveis. Um conceito fundamental na programao Ruby, como j foi mencionado o conceito de orientao a objeto (comumente conhecida como Programao Orientada a Objeto ou POO). , apesar disso, um conceito muito amplo que requer prtica para que possa ser plenamente compreendido. Nesta lio, introduziremos as noes bsicas de POO para melhor aproveitamento e uso na linguagem Ruby.

3.1 Classes, Objetos e Mtodos


Classe um aglomerado de mtodos, funes e procedimentos com os quais acessamos e usamos os objetos, realizando tarefas especcas, e de variveis, que denem o comportamento de um objeto que poder vir a existir se a classe for solicitada para tal. Um objeto uma entidade do mundo real que possui uma identidade. Podem ser entidades concretas ou conceituais. Podemos citar como exemplos de objetos: uma conta corrente, clientes, agncias, arquivos no computador, bicicletas, lojas etc. Em termos de programao, pode-se denir objeto como o resultado da ao construtora de uma classe. Todo objeto "fabricado"em uma classe, sendo por isso denominado instncia da classe. Alm disso, possuem outras caractersticas: a estrutura de objetos de uma certa classe descrita por meio de atributos; objetos de uma mesma classe tm um mesmo comportamento que so representados pelo conjunto de operaes que podem ser executadas sobre eles. O mtodo de construo de objetos com a mesma "gentica"da classe chamado de mtodo construtor.

23

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

3.2 Variaveis
Variveis de classe: h situaes em que se deseja que todos os objetos compartilhem a mesma varivel. O procedimento para realizar esse compartilhamento a denio de variveis de classe; Pacotes (Packages): conjunto organizado de classes e demais arquivos que esto relacionados atravs de um propsito comum ou atuam com dependncias entre si. So muito teis e necessrios na medida em que so usados para localizar o cdigo da classe de forma eciente.

3.3 Outro conceitos importantes


Encapsulamento: imprescindvel ao entendimento de POO e ao aprendizado da liguagem Ruby, j que indispensvel para contribuir com a diminuio dos malefcios causados pela interferncia externa sobre os dados. uma tcnica que consiste em ocultar no objeto algumas de suas variveis (ou campos) e alguns de seus mtodos. importantssimo na medida em que deixa o programa robusto, impedindo o acesso a certas partes de seu funcionamento; Herana: outro conceito importante na POO o conceito de herana, que signica que toda classe denida como uma subclasse de outra receber automaticamente todo o contedo da classe-me. Tomamos como exemplo uma classe Pessoa, onde possui como propriedades: nome, endereo, telefone, cpf e etc. Inclumos a classe Pessoa em uma classe Funcionrio, dessa forma aproveitamos todas as propriedades de Pessoa e inclumos as propriedades especcas de Funcionrio, como: data de admisso, cargo, salrio e etc; Polimorsmo: um conceito mais difcil de ser entendido, porm no menos importante o conceito de polimorsmo. Essa diculdade decorre da amplitude desse conceito e de signicados em POO. Suas variadas denies so: Overloading: designa um tipo de polimorsmo em que podemos utilizar um nome igual para designar mtodos diferentes que tero lista de parmetros tambm diferentes. Isto tanto em nmero de parmetros quanto em tipo. Os objetos de uma classe-me podem ser redenidos por objetos das suas sub-classes. Variveis podem assumir tipos diferentes ao longo da execuo; Visibilidade: atravs dos indicadores public e private algumas classes e mtodos podem ser visveis ou no. Os mtodos e propriedades pblicas sero a interface do objeto com o usurio; Abstrao: em termos de desenvolvimento, abstrao signica concentrar-se no que um objeto e faz antes de se decidir como ele ser implementado. Signica representar as caractersticas essenciais de um tipo de dado sem incluir o mecanismo que concretiza a funcionalidade. A abstrao fundamental para conseguir uma boa modularizao, que uma tcnica que tem a estratgia de dividir para conquistar, ou seja, resolver um grande problema dividindo-o em vrios problemas menores. Pergunta: Variveis de classe o conjunto organizado de classes e demais arquivos que esto relacionadas atravs de um propsito comum ou atuam com dependncias entre si. So muito teis e necessrias na medida em que so usadas para localizar o cdigo da classe de forma eciente. 24

Captulo 4

Instalao e Incio da Linguagem


4.1 Instalao
Para que voc possa utilizar o Ruby, necessrio que voc o tenha instalado na sua mquina. Existem algumas opes para se fazer isso. Uma delas baixando pelo site ocial http://www.ruby-lang.org e fazer o download para a plataforma especca. No entanto, o Debian possui uma ferramenta muito til na instalao de determinados programas. Vamos utilzar tal ferramenta para instalar o Ruby: 1 - Abra seu terminal; 2 - entre como usurio root; 3 - digite: apt-get install ruby Espere a instalao e pronto, voc poder trabalhar com o ruby normalmente. Nesse caso, teremos que utilizar um editor de texto (posso sugerir o gedit). Podemos ulilizar um programa muito bom do Ruby para ir testando o cdigo, o irb (interactive Ruby shell) e com ele no necessrio o editor de texto. Esse programa ser muito til no incio do curso. bom que vocs o tenham instalado no seu computador. possvel fazer isso da mesma forma que foi instalado o Ruby: 1 - Abra seu terminal; 2 - entre como usurio root; 3 - digite: apt-get install irb. Depois de ter feito tais comandos, o irb estar disponvel para ser usado.

4.2 Incio da Linguagem


Como vimos anteriormente, um programa muito til para nos familiarizarmos com a linguagem Ruby o irb (interactive Ruby shell). Vamos conhecer um pouco mais dele. Basta digitar: irb no terminal. Pronto! s comear a programar! Aps digitar irb aparecer no terminal: irb(main):001:0> Entre parnteses encontra-se o nome do programa que est sendo rodado; em seguida, depois do primeiro dois pontos, temos quantas linhas foram digitadas e em que linha estamos; 25

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

depois do segundo dois pontos, temos o nvel de profundidade que estamos. Um exemplo de como funciona o irb:

irb(main):001:0> puts "Apenas um teste" Apenas um teste => nil irb(main):002:0>


Digite isso e verique Observao: O "puts" um mtodo de Kernel. Isso quer dizer que podemos utiliz-lo sem especicar o mtodo ao qual ele pertence. Esse mtodo, nada mais faz do que imprimir o resultado da expresso que foi passada para ele quebrando uma linha. Um outro exemplo para demonstrar o nvel de profundidade:

irb(main):001:0> => 100 irb(main):002:0> irb(main):003:1> irb(main):004:1> irb(main):005:1* irb(main):006:1> Numero maior que => nil irb(main):007:0>

a = 100 if a > 50 puts "Numero maior que 50" else! puts "Numero menor que 50" end 50

Observe o nvel de profundidade alterando conforme o condicional processado. Tais funcionalidades como "puts"e "if/else"sero abordadas com mais detalhes nas prximas lies. Observao: importante que voc v executando o cdigo no seu terminal para que seja melhor visualizado o que est sendo feito, principalemente na prxima lio onde estaro presente muitos exemplos. Interessante seria tambm, se voc alterasse o cdigo, isto , depois de entendido o que foi feito, tentar, voc mesmo, fazer outro cdigo com a funo aprendida.

26

Captulo 5

Conhecendo um pouco a linguagem


5.1 Variveis
Como vocs devem se lembrar, foi dito na introduo que a linguagem Ruby 100% orientada a objetos, isto , tudo em Ruby objeto, no entanto, variveis no so objetos e sim referncias a esses. Em Ruby as variveis so simples de serem utilizadas pois utilizam o "duck typing", a tipagem dinmica da linguagem. Utilizando uma tipagem esttica, temos como exemplo:

irb(main):001:0> => 10 irb(main):002:0> => Fixnum irb(main):003:0> => "alo" irb(main):004:0> => String irb(main):005:0>

i = 10 i.class j = "alo" j.class

Depois de declarada a varivel i, foi pedido para mostrar o valor do atributo "class"da varivel, retornando Fixnum. Em seguida depois de atribudo o valor "alo"para a varivel j, o comando j.class foi pedido para que fosse mostrado o valor do atributo, retornando String. Isso prova que tudo em Ruby objeto. Foi dito tambm na introduo que a linguagem Ruby tem uma tipagem forte, um exemplo disso :

irb(main):001:0> a = "teste" => "teste" irb(main):002:0> b = 10 => 10 irb(main):003:0> resultado = a+b TypeError: can't convert Fixnum into String from (irb):3:in `+' from (irb):3 from :0 irb(main):004:0>
27

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

logo, no uma boa idia "misturar"os tipos. Em Ruby, para declararmos uma varivel no escopo privado bastante simples, basta fazer:

irb(main):001:0> a = 2 => 2 irb(main):002:0> puts a 2 => nil irb(main):003:0>


O sinal de igual utilizado para atribuir um determinado valor para a varivel. Agora, para declarar um varivel pblica, deve-se fazer o seguinte:

irb(main):001:0> $i = 2 => 2 irb(main):002:0>


Colocando o "$"antes da varivel, faz com que a varivel torne-se pblica.

5.2 Tipos Bsicos


A linguagem Ruby apresenta uma ferramenta essencial denominada BLOCOS DE CDIGO. Isso, nada mais do que "pedaos"de cdigos que podem ser delimitados por: (chaves), quando o bloco possui apenas uma linha ou comea com DO e termina com END, quando o bloco de cdigo tiver mais de uma linha. Por conveno, as chaves so ultilizadas para cdigos menores, ou seja, que possuem apenas uma linha. J o do...end usado para cdigos maiores. Um exemplo para os tais blocos so: Usando chaves

{puts "Apenas um teste"} (Utilizando as chaves para blocos menores)


Usando do..end

do puts "Apenas um teste" puts "Entendeu?" (Utilizando do..end para blocos maiores) end
O trabalho com blocos de cdigos funciona da seguinte maneira: um argumento passado para o bloco, onde passar por alguma condio. Mais para frente voc ver a utilidade dos blocos do cdigo. Mas ser mostrado aqui um exemplo:

irb(main):003:0> nome.sort_by{|a1| a1.length}


Passou-se um bloco como parmetro para o mtodo sort_by. Dentro do bloco, passamos o argumento a1 para o bloco que retorna o tamanho de uma string. Tal comando para ordenar um array por ordem de tamanho das strings que compem o array. Nesse momento pode haver alguma confuso, j que no vimos strings nem muito menos arrays. Mais para frente as dvidas sero esclarecidas. Na parte de nmeros, as variveis podem assumir valores inteiros (Fixnum/Bignum) ou de pontos utuantes (Float). Eis aqui alguns exemplos de inteiro: 28

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

irb(main):001:0> a = 1 => 1 irb(main):002:0> b = -30 => -30 irb(main):003:0> c = 3000000 => 3000000
Experimente fazer os comandos acima, e logo depois mostrar o tipo de cada varivel (Lembrase ainda como faz? Caso no se lembre, : puts a.class). Feito isso, atribua o valor 10_000_000_000 (como no podemos usar vrgulas ) para alguma varivel e utilize o comando para mostrar o tipo de cada varivel. O que voc percebeu? Que o tipo mudou para Bignum, ou seja, a ltima varivel, a qual voc atribuiu esse imenso valor, no coube no Fixnum e foi alterado automaticamente para Bignum. Tal artifcio caracterstico da linguagem. Alguns exemplos de pontos utuantes:

irb(main):008:0> => 1.23 irb(main):009:0> => -32.43 irb(main):010:0> => Float irb(main):011:0> => Float irb(main):012:0>

x = 1.23 y = -32.43 x.class y.class

Exitem tambm em Ruby, as constantes, que so variveis iniciadas com letras maisculas. Isso pode causar alguma confuso mais para frente, quando tratarmos do assunto relacionado a classes, j que, veremos que elas tambm so iniciadas com letras maisculas. Mas perceba a praticidade:

irb(main):001:0> Fi = 1.61803 => 1.61803 irb(main):002:0> Fi = 23 (irb):2: warning: already initialized constant Fi => 23 irb(main):003:0>
Como pode ser comprovado, foi declarada a varivel Fi(?), que o nmero ureo, no entanto, quando tentou-se mudar o seu contedo, surgiu o alerta falando que a varivel no poderia ser alterada j que se trata de uma constante. Porm, na linguagem Ruby, possvel alterar o valor de uma constante. Mas altera gerando um warning! Como em todas as linguagens de programao, no podia faltar em Ruby os Booleanos, isto , valores true ou false que algumas variveis podem assumir. Podemos aproveitar e falar tambm do nil, valor nulo que pode ser atribudo a uma determinada varivel. Tanto nil quanto o false, so os nicos valores que podem indicar falso. No entanto, eles podem pertencer a classes diferentes ou ter comportamentos diferentes. Isso pode ser comprovado com o seguinte cdigo:

irb(main):001:0> v = true
29

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

=> true irb(main):002:0> TrueClass => nil irb(main):003:0> => false irb(main):004:0> => FalseClass irb(main):005:0> => nil irb(main):006:0> => NilClass irb(main):007:0>

puts v.class f = false f.class n = nil n.class

Depois dos booleanos, um dos tipos mais comuns tambm nas linguagens de programao e, logicamente, presente em Ruby so as Strings, que nada mais so do que um tipo que armazena "palavras"ou um conjunto de palavras. Um exemplo:

irb(main):001:0> => "Teste" irb(main):002:0> => "Teste2" irb(main):003:0> => "Uma frase" irb(main):004:0> => String irb(main):005:0> => String irb(main):006:0> => String irb(main):007:0>

p1 = "Teste" p2 = "Teste2" p3 = "Uma frase" p1.class p2.class p3.class

Como em outras linguagens, a manipulao de strings pode ser feita da seguinte forma: usando [] (colchetes) com um ndice no interior. Para visualizar isso, eis um exemplo:

irb(main):001:0> palavra = "animal" => "animal" irb(main):002:0> palavra[0] = "b" => "b" irb(main):003:0> puts palavra bnimal => nil irb(main):004:0>
Explicando o que foi feito acima: primeiro atribumos para a varivel "palavra"uma string; logo depois alteramos o valor da primeira posio da string (no caso o ndice zero) trocando o caractere "a"pelo caractere "b"e imprimimos a nova string. Para criarmos strings grandes, no caso um texto, podemos usar uma ferramenta denominada heredoc, a qual funciona da seguinte forma: 30

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

irb(main):001:0> texto = <<INICIO irb(main):002:0" Comea aqui o teste irb(main):003:0" para mostrar irb(main):004:0" como funciona o heredoc irb(main):005:0" INICIO => "Come\303\247a aqui o teste\npara mostrar\ncomo funciona o heredoc\n" irb(main):006:0> puts texto Comea aqui o teste para mostrar como funciona o heredoc => nil irb(main):007:0>
Nesse exemplo, foi usado o "INICIO"depois do , para delimitar o incio e m da string. Ou seja, voc que determina a palavra que ser usada para demarcar o texto ou a "string grande". Faa um teste voc mesmo, utilize qualquer palavra para a delimitao do texto. Observao: foi utilizada a palavra delimitadora de string em caixa alta unicamente para melhorar a visualizao do cdigo, isto , para no causar confuso na hora de analisar o cdigo digitado. Falemos agora sobre como ocorre a concatenao(unio) de strings. Utiliza-se os seguintes operadores: "+="ou <"(sem as aspas). Como pode ter sido observado, essa sesso baseia-se em exemplos para que se entenda melhor como funciona determinada funo. Ento aqui vo mais dois exemplos: O primeiro exemplo para mostrar como funciona o operador <":

irb(main):001:0> t1 = "Mudando de exemplo" => "Mudando de exemplo" irb(main):002:0> t1 << ", diferente de 'teste'" => "Mudando de exemplo, diferente de 'teste'" irb(main):003:0> puts t1 Mudando de exemplo, diferente de 'teste' => nil irb(main):004:0>
O segundo exemplo para mostrar como funciona o operador "+=":

irb(main):001:0> t1 = "Outro exemplo" => "Outro exemplo" irb(main):002:0> t1 += ", diferente de 'teste'" => "Outro exemplo, diferente de 'teste'" irb(main):003:0> puts t1 Outro exemplo, diferente de 'teste' => nil irb(main):004:0>
Basicamente isso que precisamos saber de string. Mais para frente, quando comearmos a aprofundar o curso falando sobre orientao a objetos, sero mostradas algumas funes novas. Existem tambm em Ruby os intervalos denominados Ranges. Eles so declarados da seguinte forma: 31

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

irb(main):001:0> i1 = 0..5 => 0..5 irb(main):002:0> i2 = 0...5 => 0...5 irb(main):003:0>


O intervalo i1 vai conter nmeros de zero at cinco. J, o intervalo i2 ir conter os nmeros de zero at 4. Isso ocorre devido a adio de mais um ponto, fazendo com que o intervalo seja fechado em zero e aberto em 5, ou seja, inclui o zero e no inclui o cinco. Vamos falar agora um pouco sobre os operadores do Ruby. Muitos deles so bastante conhecidos por voc. - comeando pelas quatro operaes fundamentais da aritmtica: +, - , / , * , respectivamente, adio, subtrao, diviso e multiplicao; - temos tambm os operadores: ** , % , que indicam exponenciao e mdulo (vimos esse operador no exemplo para criar 2 arrays sob algumas condies); - temos os operadores de comparao: > ,< , >= , <= , respectivamente, maior, menor, maior igual, menor igual; - comparador de igualdade: ==; - and e or que so utilizados nas estruturas de controle (Veremos isso na prxima lio). Os operadores sero melhor compreendidos no decorrer desta lio, visto que sero dados exemplos. No poderia faltar nessa sesso os arrays, bastante conhecidos em vrias linguagens de programao. Eles podem conter vrios tipos de objetos. Exemplo: irb(main):001:0> v = [mais,exemplos,100] => ["mais", "exemplos", 100] irb(main):002:0> puts v mais exemplos 100 => nil irb(main):003:0> puts v[2] 100 => nil irb(main):004:0> Observe o uso de [] (colchetes) para atribuir os objetos ao array "v"e as vrgulas que separam cada termo do array. Veja tambm como faz para mostrar o contedo utilizando ndices. Existe um atalho bastante til quando trabalhamos com arrays com apenas strings, o %w. Esse atalho funciona da seguinte forma:

irb(main):001:0> v = \%w(caneta lapis apontador regua) => ["caneta", "lapis", "apontador", "regua"] irb(main):002:0>
Caso queira usar uma string "composta"(com mais de uma palavra) como no exemplo abaixo, basta utilizar o caractere " (sem as aspas).

irb(main):001:0> v1 = \%w(cachorro gato colhe tigre\ dente\ de\ sabre) => ["cachorro", "gato", "colhe", "tigre dente de sabre"] irb(main):002:0>
Observao: Perceba que houve uma pequena diferena quando utilizamos o atalho %w. Houve a utilizao de parnteses ao invs de colchetes. Vimos como montar um array a partir do nada. Agora, como faramos para adicionar elementos a um array j existente? Basta utilizar o push ou o operador (olha ele a de novo, faz sentido j que uma string um vetor de caractere). Mais um exemplo:

irb(main):001:0> v = %w(azul vermelho) => ["azul", "vermelho"] irb(main):002:0> v.push "laranja"


32

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

=> ["azul", "vermelho", "laranja"] irb(main):003:0> v.push "amarelo" => ["azul", "vermelho", "laranja", "amarelo"]
A partir daqui utilizou-se o operador <"(sem aspas) aproveitando o mesmo array.

irb(main):004:0> v << "preto" => ["azul", "vermelho", "laranja", "amarelo", "preto"] irb(main):005:0> v << "roxo" => ["azul", "vermelho", "laranja", "amarelo", "preto", "roxo"] irb(main):006:0>
Observao: Lembram-se quando foi dado o exemplo dos blocos de cdigo no incio desta lio? Ento, a partir daqui talvez que mais claro o que foi dito. Um mecanismo muito interessante em Ruby para a manipulao de arrays o seguinte: dado um determinado array, queremos criar um outro a partir de uma determinada condio depois de t-lo processado. Veja o exemplo abaixo:

irb(main):001:0> v1 = [10,11,12,13,14,15] => [10, 11, 12, 13, 14, 15] irb(main):002:0> v2 = v1.find_all{|par| par%2 == 0}.map{|par| par*3} => [30, 36, 42] irb(main):003:0>
Foi feito o seguinte: o mtodo nd_all procura todos os elementos do array que so pares (O operador % ser tratado mais a frente), o mtodo map cria um novo array somente com os elementos que foram processados com o seu valor triplicado. A ordenao de array pode ser feita utilizando o mtodo sort. Ou seja:

irb(main):001:0> v = \%w(arnaldo zeca bruno michele andrea) => ["arnaldo", "zeca", "bruno", "michele", "andrea"] irb(main):002:0> v.sort => ["andrea", "arnaldo", "bruno", "michele", "zeca"] irb(main):003:0>
Outra forma seria utilizando o sort_by. Ele ordena o array a partir de uma determinada propriedade do valor que est sendo avaliado. Veja: Ordenao por ordem alfabtica analisando a primeira letra da string.

irb(main):001:0> nome = ["zeca","amanda","beto","carla"] => ["zeca", "amanda", "beto", "carla"] irb(main):002:0> nome.sort_by{|a1| a1[0]} => ["amanda", "beto", "carla", "zeca"]
A ordenao aqui foi por ordem crescente de tamanho da string utilizando o length.

irb(main):003:0> nome.sort_by{|a1| a1.length} => ["zeca", "beto", "carla", "amanda"] irb(main):004:0>


33

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

Um outro mtodo utilizado em arrays o any? (No se espantem, a interrogao faz parte!). Tal mtodo verica se o elemento de um array se encaixa na condio gerada por um determinado bloco retornando true ou false. Exemplo:

irb(main):001:0> numero = [1,2,3,4,5] => [1, 2, 3, 4, 5] irb(main):002:0> numero.any?{|teste| teste > 3} => true irb(main):003:0> numero.any?{|teste| teste > 5} => false irb(main):004:0>
Agora, para testar se todos os elementos do array se encaixam na condio de um determinado bloco, utilizamos o mtodo all?. Eis outro exemplo:

irb(main):001:0> numero = [101,230,300,1000] => [101, 230, 300, 1000] irb(main):002:0> numero.all?{|teste2| teste2 > 100} => true irb(main):003:0> numero.all?{|teste2| teste2 > 1000} => false irb(main):004:0>
Veja agora uma ferramenta muito interessante. Trata-se da criao de dois arrays a partir de um outro array baseado na condio de um determinado bloco de cdigo. Tal mtodo denominase partition. Exemplo:

irb(main):001:0> vetor1 = [1,2,3,4,5,6,7,8,9,10] => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] irb(main):002:0> par,impar = vetor1.partition{|ex| ex%2 == 0} => [[2, 4, 6, 8, 10], [1, 3, 5, 7, 9]] irb(main):003:0> par => [2, 4, 6, 8, 10] irb(main):004:0> impar => [1, 3, 5, 7, 9] irb(main):005:0> puts par 2 4 6 8 10 => nil irb(main):006:0> puts impar 1 3 5 7 9 => nil irb(main):007:0>
34

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

Perceba o que foi feito no cdigo acima: primeiro, foram atribudos varivel vetor1 os nmeros de 1 a 10, como foi feito em diversos exemplos acima; depois dois novos arrays receberam novos elementos a partir da condio especicada pelo bloco, que no caso, ser escolher os elementos que so pares; mas esse mtodo funciona fazendo com que o primeiro array receba os elementos da condio e o segundo array recebe os elementos que no satisfazem condio; depois foi pedido para mostrar os dois arrays com seus respectivos elementos, o que j foi dito bem no incio do curso como faz. Depois de mostrado como so os arrays na linguagem Ruby, vamos falar um pouco de Hashes. Aqui no haver muito o que falar, pois, hashes so arrays com ndices que voc mesmo dene para seus elementos. Tais ndices podem ser: strings, inteiros (Fixnum) ou at mesmo smbolos (ser tratado em seguida). Veja do que se trata os hashes pelos seguintes exemplos: Utilizando strings

irb(main):001:0> hashe = {"p"=>"primeiro elemento","s"=>"segundo elemento"} => {"p"=>"primeiro elemento", "s"=>"segundo elemento"} irb(main):002:0> hashe["s"] => "segundo elemento"
Utilizando inteiros (Fixnum)

irb(main):003:0> hashe2 = {1=>"teste1",2=>"teste2"} => {1=>"teste1", 2=>"teste2"} irb(main):004:0> hashe2[1] => "teste1" irb(main):005:0>
Utilizando Smbolos

irb(main):005:0> hash3 = {:primeiro=>"elemento1", :segundo=>"elemento2"} => {:primeiro=>"elemento1", :segundo=>"elemento2"} irb(main):006:0> hash3[:segundo] => "elemento2" irb(main):007:0>
Deve ter cado alguma dvida quanto aos smbolos mencionados acima. Smbolos nada mais so que pequenas strings que representam sempre o mesmo objeto. Podem representar nomes ou Strings dentro do interpretador Ruby. So criados colocando : dois pontos) na frente do nome, como foi feito para denir os ndices dos hashes acima: :primeiro; :segundo.

35

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

Veremos uma utilidade maior dos smbolos quando tratarmos de classes. Como essa lio baseada em uma forma de conhecer por alto a linguagem Ruby, vamos falar sobre mtodos de forma supercial. Quando chegarmos na lio de classes, veremos ento a utilidade da linguagem Ruby , uma vez que, como j foi dito diversas vezes e no custa nada falar de novo, ela 100% orientada a objetos. Portanto At l veremos o que acontece de comum entre as linguagens. Para declaramos um mtodo basta inici-lo com defnome do metodo...end (parecido com a declarao de um bloco de cdigo). Um exemplo para visualizar o que foi dito:

irb(main):001:0> def testando irb(main):002:1> puts "veja o que acontece quando chamamos um metodo" irb(main):003:1> end => nil irb(main):004:0> testando veja o que acontece quando chamamos um metodo => nil irb(main):005:0>
Os mtodos tambm retornam valores que podem ser de 2 formas: com o return ou sem o return, nesse caso, o valor retornado pelo mtodo a ltima expresso avaliada. Veja o exemplo: Com o return:

irb(main):001:0> irb(main):002:1> irb(main):003:1> => nil irb(main):004:0> => 4 irb(main):005:0>


Sem o return:

def divide(x1,x2) return x1/x2 end divide(12,3)

irb(main):001:0> irb(main):002:1> irb(main):003:1> => nil irb(main):004:0> => 6 irb(main):005:0>

def divide(x1,x2) x1/x2 end divide(36,6)

Foi simples o que foi feito aqui: criamos um mtodo chamado "divide"quem tem dois argumentos. Dentro do mtodo foi colocada a expresso. Feito isso, chamamos o mtodo e passamos dois valores para seus argumentos, fazendo com que retorne o resultado da expresso avaliada. Os mtodos podem retornar tambm mais de um resultado. Na verdade, retornado apenas um objeto, no entanto, d a impresso que so vrios. Exemplo:

irb(main):001:0> def multiplos[[no]] irb(main):002:1> (1..4).map{|x|x*n} irb(main):003:1> end


36

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

=> nil irb(main):004:0> multiplos(3) => [3, 6, 9, 12] irb(main):005:0> a,b,c,d = multiplos(3) => [3, 6, 9, 12] irb(main):006:0> puts "Os multiplos de 3 so: #{a},#{b},#{c},#{d}" Os multiplos de 3 so: 3,6,9,12 => nil irb(main):007:0>
Entendendo o cdigo: criamos um mtodo que calcula os quatros primeiros mltiplos de um certo nmero. Vemos isso pelo intervalo que foi imposto no mtodo, no caso o 4. No mtodo map, criamos um array com a condio passada pelo bloco, no caso o x*n. Depois, chamamos o mtodo e passamos um valor para seu argumento. Logo aps esses procedimentos, pedimos a impresso dos mltiplos do nmero passado para o mtodo, no caso, o 3. Com isso, foi mostrado os quatro primeiros mltiplos de 3. Ainda em mtodos, uma das funcionalidades que podem ser utilizadas o passagem de um bloco como parmetro para o mtodo. Para isso, utilizamos o mtodo yield. Veja como isso feito:

irb(main):001:0> irb(main):002:1> irb(main):003:1> => nil irb(main):004:0> => 12 irb(main):005:0>

def multiplica(a1,b1) yield(a1,b1) end multiplica(3,4){|x1,x2|x1*x2}

H tambm, uma maneira de testar se o bloco foi passado ao mtodo. Para isso utilizamos o block_given como mostrado abaixo:

irb(main):001:0> def multiplica(a1,b1) irb(main):002:1> if block_given? irb(main):003:2> yield(a1,b1) irb(main):004:2> else irb(main):005:2* puts " Bloco nao passado para o metodo!" irb(main):006:2> end irb(main):007:1> end => nil irb(main):008:0> multiplica(2,7){|x1,x2| x1*x2} => 14 irb(main):009:0> multiplica(3,5){|x1,x2| x1*x2} => 15 irb(main):010:0> multiplica(3,5) Bloco nao passado para o metodo! => nil irb(main):011:0>

37

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

Observao: os parmetros so enviados como cpia da referncia de um objeto, portanto, se alterarmos o objeto que foi passado como parmetro, dentro do mtodo, o objeto ser alterado fora do mtodo tambm. Existem diferentes tipos de mtodos. So eles: mtodos destrutivos e mtodos predicados. Os mtodos destrutivos so aqueles que tm uma "!"(sem aspas) logo depois do nome. Isso faz com que o contedo do prprio objeto seja alterado na sua posio de memria. J, os mtodos predicados so aqueles que tm um "?"(sem aspas) logo aps o nome. Esses mtodos retornam true ou false e so teis para testar uma condio. Veja exemplos dos mtodos mencionados. Um exemplo de mtodo destrutivo:

irb(main):001:0> t = "Ola, apenas um teste" => "Ola, apenas um teste" irb(main):002:0> t.object_id => -605661358 irb(main):003:0> def caps(t) irb(main):004:1> t.upcase! irb(main):005:1> end => nil irb(main):006:0> caps(t) => "OLA, APENAS UM TESTE" irb(main):007:0> t.object_id => -605661358 irb(main):008:0>
Perceba que a posio de memria permanece a mesma. Mtodo predicado:

irb(main):001:0> teste = %w(hd monitor gabinete mouse) => ["hd", "monitor", "gabinete", "mouse"] irb(main):002:0> teste.include? "hd" => true irb(main):003:0> teste.include? "teclado" => false irb(main):004:0>
O cdigo consiste em dizer se uma certa palavra pertence ao array. Depois do que foi dito, nada mais aceitvel do que ver como funciona tudo em um mesmo programa. Por exemplo, testaremos o escopo das variveis dentro de um mtodo:

irb(main):001:0> => "a" irb(main):002:0> => "b" irb(main):003:0> irb(main):004:1> irb(main):005:1> irb(main):006:1> => nil

\$t = "a" t = "b" def apenas_teste puts \$t puts t end

38

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

irb(main):007:0> apenas_teste a NameError: undefined local variable or method `t' for main:Object from (irb):5:in `apenas_teste' from (irb):7 from :0 irb(main):008:0>
Perceba que atribumos varivel pblica (lembre-se que a varivel pblica quando possui o "$"(sem aspas) antes do nome) o caractere "a"e varavel privada o caractere "b". Criamos o mtodo e no seu interior, pedimos que fosse impresso na tela as duas variveis. Logo aps chamamos o mtodo. A primeira varivel foi impressa, por ser pblica. No entanto a segunda varivel no pode ser impressa. Isso ocorreu porque a segunda varivel privada, ou seja, no pode ser acessada pelo mtodo criado, ao contrrio da varivel pblica. Vamos ver agora um pouco de Ranges e blocos interagindo. As Ranges possuem um mtodo denominado each, que trabalha da seguinte forma: para cada valor da Range, o bloco tal executado. Veja o exemplo:

irb(main):001:0> r = 0..4 => 0..4 irb(main):002:0> r.class => Range irb(main):003:0> r.each{puts "Apenas outro teste"} Apenas outro teste Apenas outro teste Apenas outro teste Apenas outro teste Apenas outro teste => 0..4 irb(main):004:0>
Perceba que o bloco que contm o "puts"foi executado cinco vezes, ou seja, o intervalo da Range. Vamos agora, passar vrios argumentos para o bloco usando uma Hash. Exemplo:

irb(main):001:0> hs = {1=>"primeiro",2=>"segundo"} => {1=>"primeiro", 2=>"segundo"} irb(main):002:0> hs.each{|i,j| puts "indice:"+i.to_s+" valor:"+j.to_s} indice:1 valor:primeiro indice:2 valor:segundo => {1=>"primeiro", 2=>"segundo"} irb(main):003:0>
O mesmo vale para os arrays. Exemplo:

irb(main):001:0> vetor = %w(primeira\ posicao segunda\ posicao) => ["primeira posicao", "segunda posicao"] irb(main):002:0> vetor.each{|i| puts "Veja a: "+i.to_s} Veja a: primeira posicao
39

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

Veja a: segunda posicao => ["primeira posicao", "segunda posicao"] irb(main):003:0>


Uma ferramenta interessante a concatenao de mtodos. Por exemplo, vamos concatenar o sort e o each:

irb(main):001:0> vetor = %w(casa predio escritorio apartamento) => ["casa", "predio", "escritorio", "apartamento"] irb(main):002:0> vetor.sort.each{|j| puts "Depois de ordenado: "+j.to_s} Depois de ordenado: apartamento Depois de ordenado: casa Depois de ordenado: escritorio Depois de ordenado: predio => ["apartamento", "casa", "escritorio", "predio"] irb(main):003:0>

40

Captulo 6

Estruturas de Controle e Comentrios no Cdigo


As estruturas de controle, como o prprio nome diz, controlam as estruturas criadas. So elas: as condicionais e os loops.

6.1 Condicionais
Vamos comear com as condicionais.

6.1.1 If/Else
Se voc tem uma noo de programao, voc deve estar habituado ao famoso if/else. Funciona da seguinte forma: if...end ou, if...else...end. Com os exemplos a visualizao ser melhor. Ex1:

irb(main):001:0> texto = "palavra" => "palavra" irb(main):002:0> if texto == "palavra" irb(main):003:1> puts "O valor foi atribudo corretamente" irb(main):004:1> end O valor foi atribudo corretamente => nil irb(main):005:0>
Ex2:

irb(main):001:0> => 100 irb(main):002:0> irb(main):003:1> irb(main):004:1> irb(main):005:1* irb(main):006:1>

numero = 100 if numero > 10 puts "O numero maior que 10" else puts "o numero menor que 10" end
41

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

O numero maior que 10 => nil irb(main):007:0>


Existe tambm o elsif, muito intuitivo, mas mesmo assim, vamos mostrar um exemplo:

irb(main):001:0> valor = 5 => 5 irb(main):002:0> if valor > 5 irb(main):003:1> puts "Numero maior que cinco" irb(main):004:1> elsif valor == 5 irb(main):005:1> puts "Numero igual a cinco" irb(main):006:1> else irb(main):007:1* puts "Numero menos que cinco" irb(main):008:1> end Numero igual a cinco => nil irb(main):009:0>

6.1.2 Case
Uma condicional extremante til o case. Voc primeiramente atribui um valor para uma varivel; depois o valor servir como uma condicional para entrar em alguma das aes. Ele mais utilizado quando voc programa primeiramente com um editor de texto, quando voc pede ao usurio que fornea um valor. A partir da, voc cria blocos com as condies possveis que o usurio possa digitar. Vamos mostrar apenas o bsico, sem o editor de texo. Mais para frente mostraremos programas que utilizam um editor de texto e executado no terminal. Exemplo de case:

irb(main):001:0> opcao = 3 => 3 irb(main):002:0> case opcao irb(main):003:1> when 0..10 irb(main):004:1> puts "A opcao est entre 0 e 10" irb(main):005:1> when 10..20 irb(main):006:1> puts "A opcao esta entre 10 e 20" irb(main):007:1> else irb(main):008:1* puts "Nao esta em nenhum dos intervalos" irb(main):009:1> end A opcao est no entre 0 e 10 => nil irb(main):010:0>
Usamos um range (intervalo, est lembrado?) aqui para demonstrar a utilizao do case. Geralmente feito sempre: case (variavel)...when...else...end.

42

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

6.2 Loops
Quando temos diversas atividades a serem digitadas como uma forma de repetio, podemos utilizar um comando que "faz"essas repeties para voc. So os chamados Loops.

6.2.1 While
Vamos comear falando do loop while. Primeiramente temos um determinado valor que controlar o while, isto , o nmero de repeties que o while far. No interior do while, colocado o comando e um contador para que o loop termine. Veja o exemplo:

irb(main):001:0> => 0 irb(main):002:0> irb(main):003:1> irb(main):004:1> irb(main):005:1> 0 1 2 3 => nil irb(main):006:0>

contador = 0 while contador < 4 puts contador contador += 1 end

Observao: Voc deve ter estranhado o comando "+=". Tal comando incrementa o valor da varivel. Analogamente, temos um comando decrementador que : -="(Sem as aspas)

6.2.2 for
Um outro tipo de loop o for. Veja o exemplo para ver como ele chamado:

irb(main):001:0> for cont in (0..3) irb(main):002:1> puts "teste" irb(main):003:1> end teste teste teste teste => 0..3 irb(main):004:0>
Veja que temos um contador novamente chamado "cont"e um intervalo a ser percorrido, no caso uma range, como no comando while, existe para determinar o nmero de repeties pretendidas. E no seu interior foi determinado o comando que ser repetido, no caso, a impresso da string "teste".

43

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

6.2.3 until
Uma variante do while o until. Veja um exemplo:

irb(main):001:0> => 0 irb(main):002:0> irb(main):003:1> irb(main):004:1> irb(main):005:1> executa executa executa executa executa => nil irb(main):006:0>

cont = 0 until cont == 5 puts "executa" cont += 1 end

Podemos utilizar o begin junto com o while e until da seguinte forma: Utilizando o while e until.

irb(main):001:0> => 0 irb(main):002:0> irb(main):003:1* irb(main):004:1> irb(main):005:1> 0 1 2 3 4 => nil irb(main):006:0> irb(main):007:1* irb(main):008:1> irb(main):009:1> 5 4 3 2 1 => nil irb(main):010:0>

cont1 = 0 begin puts cont1 cont1 += 1 end while cont1 < 5

begin puts cont1 cont1 -= 1 end until cont1 == 0

Perceba que, como o loop encontra-se no nal, o ltimo valor no mostrado, no entanto, o cont1 alterado e repassado para a segunda funo. Tanto que no until o primeiro valor impresso o 5.

44

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

6.3 Comentando o Cdigo


Para nalizar essa lio, vamos falar sobre comentrios de cdigo. Tais comentrios, so muito importantes, porque explica o que voc est no seu cdigo, facilitando a compreenso do mesmo. Pode ser feito de duas formas: Utilizando "#"(sem aspas) para comentrios com apenas uma linha (veja ex1); utilizando =begin...=end para comentrios com mais linhas (veja ex2). Veja alguns exemplo: Ex1:

irb(main):001:0> def veja_o_teste irb(main):002:1> puts "veja como funciona um comentario" irb(main):003:1> end # O comentario nao e executado => nil irb(main):004:0> veja_o_teste veja como funciona um comentario => nil irb(main):005:0>
Ex2:

irb(main):001:0> def loops(cont) irb(main):002:1> begin irb(main):003:2* puts "Imprima isso" irb(main):004:2> cont += 1 irb(main):005:2> end while cont < 3 irb(main):006:1> end => nil irb(main):007:0> loops(0) Imprima isso Imprima isso Imprima isso => nil irb(main):008:0> =begin irb(main):009:0= veja como funciona irb(main):010:0= um codigo de varias linhas irb(main):011:0>= =end irb(main):012:0>

45

Captulo 7

Classes
Finalmente chegamos etapa do curso que realmente interessa no Ruby, que a parte de Orientao a objetos. Depois da breve noo de OO (Orientao a objetos) abordada na lio anterior, iremos aprofundar bem esse tpico com essa lio. Iremos utilizar agora tambm, o to esperado editor de texto(sugerido no incio do curso, o gedit) e deixar um pouco de lado o irb. Lembram-se no incio do curso, que foi pedido que se instalasse o Ruby e posteriormente o irb a m de manipular as funcionalidades do Ruby? Ento, agora com o Ruby instalado, depois de escrito o cdigo no editor de texto, rodaremos aquele no terminal da seguinte forma: Depois de escrito o cdigo, salve-o como nome do arquivo.rb. Um exemplo: digamos que voc tenha criado um arquivo com nome de Cachorro. Voc dever salvar como: Cachorro.rb. Feito isso, voc ir abrir o terminal e digitar: ruby Cachorro.rb Para esta lio, vamos criar a classe Carro.rb no editor de texto:

class Carro def initialize(marca,modelo,cor) @marca = marca @modelo = modelo @cor = cor end end corsa = Carro::new("GMC","Corsa","Vermelho") puts corsa

7.1 Variveis de Instncia


Vamos agora analisar o que foi feito aqui. Voc deve estar com muitas dvidas, uma vez que apareceram diversas coisas novas, tais como: initialize, @ e ::new. Vamos falar agora sobre as variveis de instncia. e as novidades que apareceram no exemplo para construir uma classe: initialize um mtodo utilizado em Ruby como construtor de classes. O que est entre parnteses so os parmetros utilizados pelas variveis de instncia; O "@" utilizado para denir variveis de instncia, como foi visto, basta colocar @<nome da varivel> ; 46

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

new um mtodo de classe, por isso que foi chamado com "::". Depois disso, criamos a varivel corsa, com as respectivas caractersticas e pedimos para mostrar seu contedo utilizando o puts. Aparecendo: #<Carro:0xb7d15954>. Apareceu isso, pois foi pedido para mostrar um objeto. Para que aparea as caractersticas do carro, preciso utilizar o "to_s"para converter objetos em strings, como visto em lies anteriores. Para isso, criaremos o mtodo to_s. Veja um exemplo a seguir:

class Carro def initialize(marca,modelo,cor) @marca = marca @modelo = modelo @cor = cor end def to_s "marca: #{@marca}, modelo: #{@modelo}, cor: #{@cor}" end end corsa = Carro::new("Chevrolet","Corsa","Vermelho") puts corsa
Mais uma novidade: o "#expresso". Ele funciona imprimindo a expresso que se encontra no interior das chaves. Voltemos rapidamente ao irb:

irb(main):001:0> expressa = "Veja o exemplo" => "Veja o exemplo" irb(main):002:0> puts "#{expressa}" Veja o exemplo => nil irb(main):003:0>
Veremos agora uma maneira de acessar as variveis de instncia. Logicamente, no podemos utilizar o puts corsa.marca, pois "marca" uma varivel privada da classe. Ocorrer um erro de mtodo, faa isso e verique. Para contornarmos esse erro, faremos o seguinte:

class Carro def initialize(marca,modelo,cor) @marca = marca @modelo = modelo @cor = cor end def to_s "marca: #{@marca}, modelo: #{@modelo}, cor: #{@cor}" end

47

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

def modelo #metodo para acessar a variavel de instancia @modelo end def modelo=(novo_modelo) #metodo para alterar a variavel de instancia @modelo = novo_modelo end corsa = Carro::new("Chevrolet","Corsa","Vermelho") puts corsa puts corsa.modelo corsa.modelo = "GMC" puts corsa.modelo
Explicando o cdigo: criamos o mtodo "modelo", para podermos acessar a varivel privada "modelo". Logo depois criamos o mtodo "modelo=(novo_modelo)", para alterarmos a varivel de instncia "modelo". Feito isso, pedimos para mostrar novamente a varivel corsa, qual o modelo, a alterao do modelo e nalmente pedindo para mostrar a varivel alterada. Mas como Ruby o melhor amigo do programador, ele permite que voc tenha acesso a essas variveis da seguinte forma:

class Carro attr_reader :marca, :modelo, :cor attr_writer :cor def initialize(marca,modelo,cor) @marca = marca @modelo = modelo @cor = cor end def to_s "marca: #{@marca}, modelo: #{@modelo}, cor: #{@cor}" end def modelo #metodo para acessar a variavel de instancia @modelo end def modelo=(novo_modelo) #metodo para alterar a varivel de instncia @modelo = novo_modelo end
O reader e writer tem como funo acessar as variveis da classe utilizando smbolos (lembram que foi falado que smbolo seria melhor abordado) como referncia. Vale lembrar que, em Ruby, as classes nunca so fechadas, isto , pode-se adicionar novos mtodos dinamicamente, como mostrado abaixo na classe Carro:

48

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

class Carro def novo_metodo puts "Novo metodo definido dinamicamente" end def puts "Mais um metodo definido dinamicamente" end end
Com isso, os novos mtodos podero ser acessados normalmente pelas instncias da classe Carro. Isso pode ser til para alterarmos as classes sem a necessidade de reescrev-las. Podemos tambm acessar constantes de classes facilmente. Veja como (utilizando uma classe diferente):

class Const Constante = 1234 end puts Const::constante

7.2 Variveis de Classe


So variveis que esto no contexto das classes e no das instncias. Existe somente uma cpia delas por classe e so declaradas escrevendo @@ antes do nome escolhido e SEMPRE tem que ser inicializadas antes de serem usadas. Veja um exemplo abordando tudo o que j foi visto:

class Veiculo attr_reader :marca, :modelo, :cor def initialize(marca,modelo,cor) @marca = marca @modelo = modelo @cor = cor end def to_s "marca:#{@marca} modelo:#{@modelo} cor:#{@cor}" end end class Fabricante attr_reader :fabrica, :modelos, :quantidade_fabricada

49

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

@@numero_total_de_veiculos = 0 def initialize(nome,modelos) @nome = nome @modelos = modelos @quantidade_fabricada = 0 end def fabrica(modelo,cor) if !@modelos.include? modelo puts "Alerta! O Fabricante #{@nome} no fabrica o modelo #{modelo}" return nil end puts "Fabricando um #{modelo} no fabricante #{@nome}" @@numero_total_de_veiculos += 1 @quantidade_fabricada += 1 Veiculo::new(@nome,modelo,cor,@modelos[modelo]) end def Fabricante.numero_total_de_veiculos @@numero_total_de_veiculos end end # Vamos criar agora as fabricantes volks = Fabricante::new("Volkswagen",{"Parati"=>30,"Jetta"=>40,"Passat"=>10}) ford = Fabricante::new("Ford",{"Ranger"=>30,"EcoSport"=>20,"Focus"=>10}) # Vamos criar agora os veiculos da Volks (com um erro) veiculos_volks = [] veiculos_volks.push(volks.fabrica("Parati",:vermelho)) veiculos_volks.push(volks.fabrica("Jetta",:verde)) veiculos_volks.push(volks.fabrica("Ranger",:preto)) puts "#{volks.nome} fabricou #{volks.quantidade_fabricada} automveis at o momento" veiculos_volks.each {|v| puts v unless v.nil?} puts #Vamos agora criar os veiculos da Ford veiculos_ford = [] veiculos_ford.push(ford.fabrica("Ranger",:preto)) veiculos_ford.push(ford.fabrica("EcoSport",:amarelo)) veiculos_ford.push(ford.fabrica("Focus",:prata)) puts "#{ford.nome} fabricou #{ford.quantidade_fabricada} automveis at o momento"
50

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

automoveis_ford.each {|v| puts v unless v.nil?} puts puts "Quantidade total de automveis no mundo : #{Montadora:: numero_total_de_veiculos}"
Quando criamos classes com alguma ligao entre elas, surge uma hierarquia entre elas. A primeira classe a chamada classe pai e as demais as classes lhas. Para executar os mtodos da classe pai, usamos o super, que funciona enviando todos os parmetros recebidos no mtodo para a classe pai. No entanto, h vezes que, por falta de ateno do programador, o nmero de argumentos enviados para a classe pai diferente do nmero de argumentos, com isso aparece o seguinte erro: <ArgumentError> . Para contornar esse erro devemos fazer o seguinte: super(parmetro1, parmetro2,...) para que a chamada seja de acordo com os parmetros utilizados pela classe pai. Veja alguns exemplos a seguir: Ex1:

class Apenas_teste def initialize (a1,a2) @i1 = a1 @I2 = A2 end def imprime puts "primeiro argumento: #{@i1}, segundo argumento: #{@i2}" end end class Apenas_outro_teste < Apenas_teste def initialize(a1,a2) super end end e1 = Apenas_teste::new(a,b) e2 = Apenas_outro_teste::new(c,d) e1.imprime e2.imprime
Isso vai mostrar na tela: primeiro argumento: a, segundo argumento: b primeiro argumento: c, primeiro argumento: d Ex2:

class Apenas_teste def initialize (a1,a2) @i1 = a1 @I2 = A2


51

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

end def imprime puts "primeiro argumento: #{@i1}, segundo argumento: #{@i2}" end end class Apenas_outro_teste < Apenas_teste def initialize(a1,a2) super end end e1 = Apenas_teste::new(a,b) e2 = Apenas_outro_teste::new(d) e1.imprime e2.imprime
Aparecer o seguinte erro: super.rb:12:in ?initialize?: wrong number of arguments (1 for 2) (ArgumentError) from super.rb:12:in ?initialize? from super.rb:17:in ?new? from super.rb:17 Isso ocorreu devido ao nmero de parmetros que foram passados para a classe pai. Para contornar a situao devemos fazer:

class Apenas_teste def initialize (a1,a2) @i1 = a1 @I2 = A2 end def imprime puts "primeiro argumento: #{@i1}, segundo argumento: #{@i2}" end end class Apenas_outro_teste < Apenas_teste def initialize(a1,a2) super(0,a2) end end e1 = Apenas_teste::new(a,b) e2 = Apenas_outro_teste::new(d) e1.imprime e2.imprime
52

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

Isso vai mostrar na tela: primeiro argumento: a, segundo argumento: b primeiro argumento: 0, primeiro argumento: d Mostraremos aqui agora um pouco sobre herana. Como foi dito na lio anterior, herana signica que toda classe denida como uma subclasse de outra receber automaticamente todo o contedo da classe pai. Com isso, voltando ao exemplo das montadoras, a classe veculo pode criar tanto automveis quanto caminhes. Portanto, basta criar uma classe pai com os atributos e mtodos em comum e depois criar diversas subclasses com as caractersticas da classe pai e mais alguns mtodos e atributos. Veja o exemplo a seguir:

class Veiculo attr_reader :marca, :modelo, :cor def initialize(marca,modelo,cor) @marca = marca @modelo = modelo @cor = cor end def to_s "marca:#{@marca} modelo:#{@modelo} cor:#{@cor}" end class Carro < Veiculo def to_s #o to_s foi usado para retornar se ser fabricado um carro ou um caminho. "Carro: "+super end #veja que para criar uma classe a partir de outra, basta fazer classe_nova < classe_velha end class Caminhonete < Veiculo def to_s "Caminhonete: "+Veiculo end end end class Fabricante attr_reader :fabrica, :modelos, :quantidade_fabricada @@numero_total_de_veiculos = 0 def initialize(nome,modelos) @nome = nome @modelos = modelos @quantidade_fabricada = 0 end def fabrica(modelo,cor)
53

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

if !@modelos.include? modelo puts "Alerta! O Fabricante #{@nome} no fabrica o modelo #{modelo}" return nil end puts "Fabricando um #{modelo} no fabricante #{@nome} " @@numero_total_de_veiculos += 1 @quantidade_fabricada += 1 Veiculo::new(@nome,modelo,cor) end Carro::new(@nome,modelo,cor) Caminhonete::new(@nome,modelo,cor) def Fabricante.numero_total_de_veiculos @@numero_total_de_veiculos end end # Vamos criar agora as fabricantes volks = Fabricante::new("Volkswagen",{"Parati"=>30,"Jetta"=>40,"Passat"=>10, "17210C"=>275}) ford = Fabricante::new("Ford",{"Ranger"=>30,"EcoSport"=>20,"Focus"=>10, "C-815"=>150}) # Vamos criar agora os veiculos da Volks (com um erro) veiculos_volks = [] veiculos_volks.push(volks.fabrica("Parati",:vermelho)) veiculos_volks.push(volks.fabrica("Jetta",:verde)) veiculos_volks.push(volks.fabrica("Ranger",:preto)) veiculos_volks.push(volks.fabrica("17210C",:branco)) puts "#{volks.nome} fabricou #{volks.quantidade_fabricada} automveis at o momento" veiculos_volks.each {|v| puts v unless v.nil?} puts #Vamos agora criar os veiculos da Ford veiculos_ford = [] veiculos_ford.push(ford.fabrica("Ranger",:preto)) veiculos_ford.push(ford.fabrica("EcoSport",:amarelo)) veiculos_ford.push(ford.fabrica("Focus",:prata)) veiculos_ford.push(ford.fabrica("C-815",:cinza)) puts "#{ford.nome} fabricou #{ford.quantidade_fabricada} automveis at o momento"

54

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

automoveis_ford.each {|v| puts v unless v.nil?} puts puts "Quantidade total de automveis no mundo : #{Montadora::numero_total_de_ veiculos}"
Como foi falado no comentrio do cdigo, para criarmos uma classe nova, basta fazermos: classe_velha < classe nova. De acordo com a herana a nova classe ter os atributos e os mtodos da classe pai. Nos mtodos temos presente tambm, os controles de acesso. So eles: os mtodo pblicos, privados e protegidos. O tipo de acesso especicado por smbolos. Os mtodos pblicos podem ser acessados por qualquer mtodo em qualquer objeto. Ex:

class ApenasTeste def diz_ola "ola!" end def cumprimenta(diferente) puts "Eu cumprimento:"+diz_ola puts "A outra classe cumprimenta:"+diferente.diz_ola end public :diz_ola # Especificao por smbolos. end class ApenasTesteFilha < ApenasTeste def metodo_ola puts "Filha cumprimento:"+diz_ola end end class ClasseDiferente def cumprimenta(outra_forma) puts "Classe diferente acessando:"+diferente.diz_ola end end pub1 = ApenasTeste::new pub2 = ApenasTeste::new filha= ApenasTesteFilha::new dif = ClasseDiferente::new pub1.cumprimenta(pub2) filha.metodo_ola dif.cumprimente(pub1)

55

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

No "pub1.cumprimenta(pub)"A instncia de pub1 chama o mtodo diz_ola de pub2. Isso possvel porque o mtodo de pub2 pblico e pode ser chamado por qualquer classe, que esteja na hierarquia, no caso a classe ApenasTesteFilha. Os mtodos privados s podem ser chamados dentro do seu prprio objeto, no entanto, nunca possvel que seu mtodo seja acessado por outro objeto, mesmo que esse objeto seja uma subclasse da classe do primeiro objeto mencionado. Ex.:

class Teste1 def diz_ola "ola!" end def cumprimenta(diferente) puts "Eu cumprimento:"+diz_ola puts "A outra classe cumprimenta:"+diferente.diz_ola end private :diz_ola end class Teste1Filha < Teste1 def metodo_oi puts "Filha cumprimenta:"+diz_ola end end class ClasseDiferente def cumprimente(outra_forma) puts "Classe diferente acessando:"+outra.diz_ola end end pri1 = Teste1::new pri2 = Teste1::new filha= Teste1Filha::new dif = ClasseDiferente::new filha.metodo_ola pri1.cumprimente(pri2) # pri1 nao consegue acessar pri2 dif.cumprimente(pri1) # estranha nao consegue acessar pri1
Se rodarmos esse cdigo aparecer o seguinte erro: TestePrivado.rb:7:in ?cumprimenta?: private method ?diz_ola? called for #<Teste1:0xb7e573e0> (NoMethodError) from Teste1.rb:30 Esse erro ocorre porque, primeiramente chamamos o mtodo da lha que aciona o mtodo herdado "diz_ola". A classe principal chama seu mtodo "diz_ola", no entanto no consegue acessar o mtodo da outra classe mesmo que as duas pertenam ao mesmo objeto. Os mtodos protegidos podem ser acessados pelos seus descendentes. 56

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

Ex.:

class TesteProtect def diz_ola "ola!" end def cumprimenta(diferente) puts "Eu cumprimento:"+diz_ola puts "A outra classe cumprimenta::"+diferente.diz_ola end protected :diz_ola end class TesteProtectFilha < TesteProtect def metodo_oi puts "Filha cumprimenta:"+diz_ola end end class ClasseDiferente def cumprimenta(diferente) puts "Classe diferente acessando:"+diferente.diz_ola end end pro1 = TesteProtect::new pro2 = TesteProtect::new filha= TesteProtectFilha::new dif = Classediferente::new pro1.cumprimenta(pro2) # pro1 consegue acessar pro2 filha.metodo_oi dif.cumprimente(pro1) # diferente nao consegue acessar pro1
Tais conceitos de mtodos pblicos e privados so exclusivos da linguagem Ruby, diferindo das outras linguagens de programao.

57

Captulo 8

Entradas e Sadas
8.1 Fluxos de Entradas e Sadas Simples
Como em todas as linguagens de programao, existe, tambm em Ruby, os uxos de entrada e sadas. E podem ser uxos simples e uxos complexos. Os uxos simples de sada so: puts, print. O primeiro foi muito utilizado nas lies anteriores. E como foi visto, utilizado para imprimir e quebrar uma linha. J o print apenas imprime e mantm na mesma linha. J um uxo de entrada simples o gets. Veja o exemplo desses uxos de entrada e sada no cdigo abaixo feito no editor de texto:

begin puts puts puts " CODIGO DE ENTRADA E SADA" print "--------------------------" puts puts puts puts "Insira o nome do usurio: " nome = gets # foi digitado aqui fulano de tal puts puts puts "O nome do usurio : #{nome}" puts puts "Pressione 'Enter' para sair" gets end
Ser impresso isso no terminal: CODIGO DE ENTRADA E SADA Insira o nome do usurio: Monitor

58

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

O nome do usurio : fulano de tal Pressione Enter para sair Perceba que o cdigo tem diversos "puts"para ir pulando a linha, isso foi feito para visualizar melhor o cdigo. Isso vai do gosto do programador. feito para melhorar o contato entre o programa e o usurio, para que no que confuso depois de interpretado o cdigo. Veja que utilizamos o gets. No primeiro momento em que ele foi utilizado, este tem como nalidade atribuir varivel "nome"o que o usurio digita no teclado depois de pressionada a tecla "enter". No segundo momento, ele foi utilizado para que o programa encerre somente quando o usurio pressionar "enter".

8.2 Arquivos
J os uxos de entrada e sada so mais complexos, podemos citar os arquivos. A linguagem Ruby trabalha muito bem com arquivo texto. Vamos ver um cdigo que abordar de forma geral tudo que precisamos saber sobre arquivos. No editor de Texto (sugiro novamente o gedit), vamos comear com o corpo principal do nosso problema: criar uma agenda. Posteriormente faremos algumas "brincadeiras"para melhorar o contato entre o usurio e o programa. Na primeira linha digitaremos:

exemplo_texto = File.new("Teste.txt","w")
O que foi feito aqui: atribumos varivel "Exemplo_texto"todas a informao fornecidas antes de gravar no arquivo texto. Ela receber o objeto "File"(manuseia o arquivo) junto com o atributo "new"(cria um novo arquivo). Mandamos os parmetros entre parnteses para o atributo "new"o <nome do texto> que ser gravado e a opo de gravao "w"(vem de write). Agora faremos o seguinte: falar o que queremos escrever no arquivo texto. Pode ser feito de vrias formas. Vamos falar de duas delas:

exemplo_texto.write "Escreve no arquivo"


OU

exemplo_texto.puts "Escreve no arquivo"


O primeiro modo utilizando o mtodo "write"depois da varivel. Esse mtodo s pode ser utilizado quando iniciamos a varivel com "File.new(...)". Aps o metdo est o que ser escrito no arquivo. O segundo modo utilizando o mtodo "puts". Ele funciona semelhantemente ao primeiro mtodo (write), diferindo na hora da escrita. O "puts"coloca uma informao em cada linha e o write coloca tudo na mesma linha. Depois de escrever o que queramos, utilizamos o mtodo "close"para fecharmos o arquivo da seguinte forma:

exemplo_texto.close
Juntando tudo j temos o seguinte: 59

CDTC

Centro de Difuso de Tecnologia e Conhecimento

Brasil/DF

exemplo_texto = File.new("Teste.txt","w") exemplo_texto.puts "Escreve no arquivo" exemplo_texto.close


Caso no se lembrem mais, temos que salvar esse cdigo como <nome do arquivo>.rb, no caso podemos salvar como: ApenasTeste.rb. Rodem no terminal digitando: ruby ApenasTeste.rb O arquivo criado vai para a mesma pasta que voc salvou o cdigo. Faa isso e veja se o arquivo foi criado e qual o seu contedo. Como nosso intuito aqui de criar uma agenda, e como j vimos como funciona o gets, utilizaremos ele aqui. Vamos fazer o seguinte:

print " Insira o nome do contato: " nome = gets print " Insira o numero do telefone: " telefone = gets agend = File.new("Agenda.txt","w") agend.print "#{nome}" agend.print "#{telefone}" agend.close
Explicando o cdigo: Primeiramente utilizamos o print para mostrar na tela o que o usurio deve fazer, com isso o cursor do terminal ca na frente da frase e no pula uma linha como aconteceria se utilizssemos o puts. Depois atribumos varivel nome o que o usurio escreveu. Logo depois criamos a varivel agend com as devidas especicaes para salvar nela o que ser desejado. Depois, gravamos no arquivo os contedos das variveis nalizando com o fechamento do arquivo. Vamos agora ver como lemos um arquivo j criado pela gente. Com o irb aberto digite: File.readlines("Agenda.txt"). O readlines l o arquivo e faz com que seja mostrado o que est gravado no arquivo (depender do que voc tenha escrito). O arquivo que eu criei teve a seguinte sada:

irb(main):001:0> File.readlines("Agenda.txt") => ["joao\n", "45545454\n"] irb(main):002:0>


til seria se armazenssemos o que tem dentro do arquivo em uma varivel para que seja melhor compreendido:

irb(main):001:0> File.readlines("Agenda.txt") => ["joao\n", "45545454\n"] irb(main):002:0> text = File.readlines("Agenda.txt") => ["joao\n", "45545454\n"] irb(main):003:0> puts text joao 45545454 => nil irb(main):004:0>
60

Você também pode gostar