Sei sulla pagina 1di 84

Ruby Prof.

Tales Bitelo Viegas

Comunidade

Existe uma grande comunidade de Ruby na internet, muito fcil achar informaes, exemplos de cdigo, projetos open-source e mais. http://www.rubygems.org

A sintaxe fcil e a filosofia da linguagem favorecem um desenvolvimento mais gil O framework Ruby On Rails, que ganha cada vez mais espao atualmente, um exemplo dos resultados que se pode obter.
Convention over Configuration Dont Repeat Yourself

bom saber que a instalao de Ruby inclui o irb (Interactive Ruby Shell), um interpretador que nos permite escrever cdigo e receber imediatamente o retorno. Tambm vem incluso o RI, que fornece a documentao.

Ruby dinmica

A tipagem das variveis dinmica, determinada em tempo de execuo pelo interpretador

Ruby mais dinmica

At mesmo as classes do core do Ruby so abertas e podemos modific-las em tempo de execuo

DRY Dont Repeat Yourself } Ruby favorece cdigo pequeno e elegante


}

Hello World Observamos aqui: usamos o mtodo print para imprimir a string Hello World no console. Notem que a delimitao dos comandos uma nova linha

Como em Ruby s declaramos as variveis no momento estritamente necessrio, precisamos ficar atentos para o escopo das mesmas. } Temos os seguintes escopos de variveis:
}

Local declaradas normalmente com letra minscula ou comeando com o caracter _ _ Global declaradas com $ na frente do nome $ Classe declaradas com @ na frente do nome

Exemplificando

Em Ruby temos operadores aritmticos e booleanos muito semelhantes aos de outras linguagens. Observem a tabela a seguir:

Operador + */% ** <= < > >= == != && and || or ! not

Descrio Soma e subtrao Multiplicao, diviso e mdulo da diviso Exponenciao Operadores de comparao E lgico OU lgico Negao

Um aspecto interessante em Ruby que ns podemos mudar o valor de constantes sem culpa. } O interpretador reclama mas consente
}

Ruby dinmica e estaticamente tipada. Isso quer dizer que as variveis so do tipo de objeto que elas referenciam em determinado momento do programa.

Porm ela tambm forte, ou seja, no podemos fazer algumas gracinhas, como demonstrado a seguir...

O operador += no est definido para a soma de um Fixnum com uma String, portanto foi gerado um erro. Ruby evita fazer converses implcitas.

Em linguagens como C ou C++ temos funes, mas em Ruby nosso trabalho ser feito por mtodos, o que faz sentido j que tudo um objeto.

Cada mtodo um novo escopo, portanto podemos ter variveis locais. No possvel declarar constantes dentro de mtodos.

O ltimo valor executado no mtodo ser retornado.

Em Ruby possvel utilizar os caracteres ? e ! no nome dos mtodos. } Como conveno informal, podemos usar esses caracteres para deixar nossos mtodos mais intuitivos. } ? em mtodos query (fazem uma pergunta) } ! em mtodos destrutivos (modificam o objeto)
}

Mtodos query, uma pergunta que geralmente respondida com um boolean

Mtodos destrutivos

Sabendo que a distncia da Terra at a Lua 380.000 Km, faa um mtodo que, dado o nmero de viagens da Terra at a Lua (ida e volta), calcule a distncia total percorrida. Escreva um programa que diga quantos anos tem uma pessoa que j viveu 9790000000 segundos

Em nossos programas usaremos o mtodo gets para entrada de dados via console g Ele nos retorna um string com o texto digitado at que ENTER seja apertado Importante saber que o \n (line feed) VAI estar presente na string recolhida

Como podemos us-lo?

Outro exemplo

to_i : converte para integer } to_s : converte para string } to_f : converte para float
}

Por enquanto no vamos nos preocupar com a consistncia do que digitado

Como estruturas de controle temos:


IF ELSIF UNLESS CASE

Observemos o uso do if

Somente FALSE (duh) e nil avaliam para falso em um teste

Tambm temos o operador IF ternrio, semelhante ao que existe em outras linguagens. Podemos optar por usar o if aps a expresso de resposta, para deixar o cdigo mais legvel

Uso do ELSIF

Outra alternativa a verso negada do IF, o UNLESS

Para termos a mesma funcionalidade do SWITCH de outras linguagens, existe a construo CASE...WHEN

Como estruturas de repetio temos:


WHILE FOR UNTIL BEGIN LOOP

Ruby j vem com muitas classes embutidas que facilitam a vida do programador e o impedem de reinventar a roda. Vamos dar uma olhada agora em:
Fixnum e Bignum Arrays

Herdado da classe Integer, os dois representam nmeros inteiros, com a diferena na magnitude do mesmo Fixnum trata de nmeros at 31bits e Bignum trata nmeros maiores Ruby cuida da converso entre eles

Arrays em Ruby so um pouco diferentes do que vocs podem estar acostumados e incluem vrios mtodos interessantes preciso saber que em Ruby os arrays podem conter objetos de mais de uma classe ao mesmo tempo

O mtodo each um exemplo de um iterator O essencial em Ruby evitar usar os loops da maneira como estamos acostumados em outras linguagens A estrutura do prprio objeto deve nos permitir iterar sobre ele

Uma das grandes features de Ruby so os blocos de cdigo. Eles funcionam como as funes annimas (closures) de outras linguagens J usamos eles vrias vezes antes

Observe aqui que blocos de cdigo so como funes que so definidas e usadas imediatamente. } Note que se tornam muito poderosos combinados com outros aspectos de Ruby
}

Lembrando dos mtodos each e times que usamos anteriormente. Eles recebem um bloco de cdigo e o executam sob algumas circunstncias O core do Ruby est cheio deles, mas tambm podemos escrever os nossos

Crie um mtodo que receba um array como parmetro e o preencha com strings inseridas pelo usurio at ser digitada a palavra pare. Use esse array para preencher dois arrays e imprima a interseco dos dois

sort : [5, 1, 6, 2].sort => [1, 2, 5, 6] } include? : [um,dois].include?(um) => true } all? : [1, 5, 20].all? {|x| x>0} => true [1, 5, 20].all? {|x| x>1} => false } any? : [1, 5, 20].any? {|x| x>10} => true [1, 5, 20].any? {|x| x>30} => false } fetch : [a,b,c,x].fetch(0) => a [a,b,c,x].fetch(5, -1) => -1 } length : [p,e,t].length => 3 } empty : [].empty => true
}

capitalize: ruby.capitalize => Ruby } reverse: ruby.reverse => ybur } upcase: ruby.upcase => RUBY } downcase: RUBY.downcase => ruby } length: ruby.length => 4 } swapcase: RuBy.swapcase => rUbY } next: ruby.next => rubz } empty?: ruby.empty? => false } chop: ruby.chop => rub } include?: ruby.include?ub => true
}

Symbols } Hashes
}

Smbolos podem ser considerados como strings mais leves, mas elas so mais do que isto } Diferentemente das strings, se usarmos um smbolo com o mesmo texto em mais de um contexto diferente, ele referenciar o mesmo dado na memria
}

Exemplo

Vrios dados internos de Ruby so representados por smbolos } Symbols so muito usados em Rails } Para converter uma string para smbolo podemos usar o mtodo .to_sym } Ao estudarmos Hashes entenderemos um pouco mais sobre a importncia de se usar smbolos
}

Podemos imaginar Hashes como arrays que podem ser indexados no apenas por inteiros, mas por qualquer objeto } Importante notar: temos keys (o que indexa) e values (o que indexado) } Usar Hashes uma prtica comum em Rails
}

Por exemplo

comum indexar hashes por strings, porm existe uma desvantagem nesse processo } Imagine agora criar 30 hashes desse tipo. Note que alocaramos 30 vezes cada uma das chaves } O que nos importa so os dados, por isso no queremos gastar memria com as chaves
}

A soluo utilizar smbolos como chaves do Hash. Mesmo que tenhamos centenas de Hashes com as mesmas chaves, todas elas referenciaro os mesmos smbolos na memria.

merge: hash.merge(outro_hash) => retorna um hash com a unio dos dois hashes passados } merge!: hash.merge!(hash) => igual a merge, mas modifica o objeto original } size: hash.size => retorna o nmero de elementos do hash } has_key?: hash.has_key?(:Ruby) => true se possuir a chave passada } has_value?: hash.has_value?(:Ruby) => true se a chave possuir valor
}

Um objeto uma entidade que serve de container para informaes e tambm controla o acesso a elas. O objeto possui uma srie de atributos que, essencialmente, no so mais do que variveis que pertencem a este objeto. O mesmo ter associado a ele vrias funes (mtodos), que fornecem uma interface para utiliz-los.

Em Ruby a criao de novas classes muito simples

Notem o mtodo initialize. Ele o construtor das instncias da nossa classe. Ns especificamos que ele recebe dois parmetros, nome e raa e os atribui a duas variveis de classe. } As variveis de classe so declaradas com uma @ na frente
}

Aqui uma implementao da classe Cachorro

E podemos us-lo da seguinte maneira:

1.

2.

Crie uma classe SuperHero, que possui como dados o seu nome, sua identidade secreta e um array com seus superpoderes. A classe deve incluir um mtodo chamado combater_crime e outros a gosto Use os mtodos da classe criada para ver se esto funcionando

Pegando a classe Cachorro que fizemos anteriormente. E se quisermos acessar os dados dos nossos objetos? Mtodos setter e getter?

Usando:

Mas Ruby pode nos fornecer setters e getters automaticamente...

Observe:

Com esta construo teremos efetivamente o mesmo resultado

Podemos usar:

attr_accessor: cria um getter e setter attr_reader: cria somente o getter attr_writer: cria somente o setter

Vamos agora tentar imprimir o nosso cachorro

O que aconteceu? O mtodo puts converte o objeto para String. Como o nosso Cachorro um objeto e herda de Object, ele chama o mtodo to_s que est definido na classe Object

Ento, podemos facilmente fazer uma impresso mais bonita do nosso cachorro, redefinindo o mtodo to_s:

Depois que j tivermos a nossa classe pronta, podemos salv-la como um arquivo .rb } Usando o comando require arquivo (sem a extenso) podemos incluir um arquivo e usar suas classes e funes. } O comando require procura arquivos no diretrio em que o programa est sendo executado e no diretrio padro do Ruby
}

Um aspecto importantssimo em Ruby (e em qualquer linguagem orientada a objetos) poder criar classes a partir das que ns j temos. No jargo da OO essa tcnica denominada herana. } Vamos agora criar a classe SpiderMan a partir do SuperHero que j est pronta
}

A herana dada pelo operador < } Notem que a classe filha recebe todos os mtodos da classe pai
}

Podemos redefinir mtodos da classe pai na classe filha. } O mtodo super, quando usado dentro de um mtodo, chama o mtodo correspondente da classe pai. } No exemplo anterior chamamos o mtodo initialize da classe SuperHero
}

Potrebbero piacerti anche