Maurício Linhares

APRENDENDO RUBY
O que?
—  Do   Japão
  ◦  Yukihiko “Matz” Matsumoto

—  Trazida
         ao mundo ocidental pelos
  Pragmatic Programmers
  ◦  Andy Hunt e Dave Thomas (livro da
     machadinha)

—  Completamente    orientada a objetos
  ◦  Não existem tipos primitivos
Como?
—  Linguagem “de   script” interpretada;

—  Muito   influenciada por Smalltalk e Perl;

—  Contém conceitos de linguagens
  funcionais (closures – blocos de código);

—  Completamente
                dinâmica (tudo pode
  mudar em tempo de execução);
RVM – Ruby Version Manager
—  Solução
          pra instalar vários
  interpretadores Ruby ao mesmo tempo
  na sua máquina;

—  Possibilita
            criar aplicações completamente
  independentes no seu ambiente de
  desenvolvimento, isolando tudo e todos;
Instalando o RVM
—  Instale   o Git na sua máquina

—  bash
       < <(curl –s
  https://rvm.beginrescueend.com/install/rvm)

—  Feche     o console e abra outra vez

—  rvm    notes
  ◦  E faça o que ele mandar
Instalando um Ruby com o RVM
—  rvm   install ruby-1.9.2

—  rvm   use 1.9.2

—  rvm   --default use 1.9.2
Rubygems!
—  gem   install bundler rails

—  ORubygems é o gerenciador de pacotes
  do Ruby, é com ele que você vai instalar
  as dependências da sua aplicação;

—  Na
     sua máquina ele é chamado pelo
  comando “gem”;
Bundler -> bundle install
—  É
    quem garante que todas as
  dependências da sua aplicação estão
  disponíveis para que ela possa executar;

—  Usaum arquivo chamando Gemfile onde
  você define as suas dependências e ele as
  instala usando o Rubygems;

—  Garante
          que todos os desenvolvedores
  usam as mesmas coisas no trabalho;
Começando a brincar com o IRB
—  IRBé o “Interactive Ruby”, o console da
  linguagem;

—  Pode-se enviar comandos ou se definir
  classes, módulos, funções e qualquer
  outra coisa pra se utilizar durante uma
  sessão;
Brincando
numero = 30
outro_numero = -20
numero + outro_numero

numero + outro_numero.abs
Primeiras tres regras de Ruby
—  Nãose usam ‘;’ ou qualquer outra coisa pra
  indicar o fim de uma linha, o fim da linha é o
  fim da linha, oras;

—  Variáveis
          não tem tipo, elas simplesmente
  guardam um objeto qualquer, de qualquer
  tipo;

—  Quando nós vamos dar nomes a variáveis,
  normalmente separamos nomes compostos
  com “_”;
Continuando a brincadeira,
definindo um método
def soma( primeiro, segundo)
 primeiro + segundo
end

soma( 10, 20)

soma 50, 90
Mais quatro regrinhas – 1
—  A
    definição de um método começa com
  “def” depois vem o nome do método e
  depois seus parâmetros entre parenteses;

—  Blocosde código, como métodos, classes,
  “ifs” são sempre fechados com “end”, aqui
  não tem “{}” não;
Mais quatro (5) regrinhas - 2
—  EmRuby não se usa “return”, se a última
  expressão no corpo de um método for
  avaliada para um valor, esse valor é
  retornado;

—  O
    uso de parênteses não é obrigatório na
  chamada de métodos, mas tenha cuidado
  com a legibilidade;

—  Bem, vocêainda pode usar “return” se
  quiser, mas é feio, oras;
Classes
class Song
  def initialize(name, artist, duration)
      @name = name
      @artist = artist
      @duration = duration
  end
end

musica = Song.new “Denied”, “Sonic
 Syndicate”, 3
musica.inspect
Mais regras
—  A
    definição de uma classe começa com a
  palavra “class”;

—  As
     classes são sempre “abertas”, você pode
  redefinir os métodos de uma classe em
  qualquer lugar, é só declarar ela outra vez;

—  Nomesde classe normalmente são definidos
  usando CamelCase (como em
  NomeDeClasse);
Mais regras
—  Os contrutores são os métodos “initialize
  ()”, que são invocados indiretamente,
  através do método de classe “new”;

—  Nãoé possível fazer sobrecarga de
  construtores em Ruby =( ;

—  Variáveis
         de instância tem o nome
  começado por “@”;
Atributos
class Song
  attr_writer :duration
  attr_reader :duration
  attr_acessor :title
end
song = Song.new("Bicylops", "Fleck", 260)
song.duration = 257
song.title = ‘Triciclops’
Regras denovo
—  attr_reader
             define métodos de acesso a
 um atributo de instância de um objeto;

—  attr_writer
            define métodos de alteraçao a
 um atributo de instância de um objeto,
 assim como o reader, ele cria a variável
 dentro do objeto;

—  attr_acessor
              faz o mesmo que os dois
 anteriores juntos;
Definindo atributos virtuais
class Song
  def duration_in_minutes
      @duration/60.0
  end
  def duration_in_minutes=(new_duration)
      @duration = (new_duration * 60).to_i
  end
end
O que é que nós fizemos?
—  Criamosmétodos de acesso a um
 atributo, mas o cliente não sabe se são
 métodos ou se ele está acessando os
 atributos diretamente;

—  Sobrescrevemos o operador
 “=“ (atribuição) para a nossa propriedade,
 Ruby tem sobrecarga de operadores
 (alguns, apenas)!
Constantes,Variáveis e métodos de
classe
class SongList
  @@calls_total
  MAX_TIME = 5*60 # 5 minutos
  MIN_TIME = 1*60 # 1 minuto
  def SongList.is_too_long(song)
       song.duration > MAX_TIME
  end
  def self.is_too_short(song)
       song.duration < MIN_TIME
  end
end
E aí?
—  Variáveis
          de classe são definidas com dois
  “@”, como em “@@variavel_de_classe”;

—  Constantessão definidas com o seu nome
  completo em “caixa alta” (na verdade é só a
  primeira letra, mas use o NOME
  COMPLETO);

—  Métodos
          de classe são definidos colocando
  o nome da classe antes do nome do método
  ou usando “self” (é o “this” em Ruby);
acesso aos objetos
class MyClass
        def method1 # o padrão é public
        end
   protected
        def method2
        end
   private
        def method3
        end
   public
        def method4
        end
end
Como acessar?
—  Osníveis de acesso são definidos em
  blocos, quando não há definição, é public,
  quando se quer definir um nível de
  acesso, deve-se utilizar um bloco de
  acesso;

—  Um bloco termina assim que outro se
  iniciar;
Mas não é ruim não ter tipos?



           Eu faço “quack()”, “nadar()”
           e “voar()”, igual a qualquer
           outro pato, eu sou ou não
                    um pato?
Tudo são mensagens!
—  Pois   é, você perdeu a aula de Smalltalk né?

—  Nãoimporta qual o tipo do objeto, o que
  importa são as mensagens (métodos?)
  que ele é capaz de responder;

—  Se
     faz quack, nada e voa feito um pato,
  então pra mim é um pato;
Arrays
a = [ 3.14159, "pie", 99 ]
a[0] # 3.14159
a[3] # nil
a << 123 # adicionando um item
a[4] = 456 #adicionando outro item
a[-1] # 456 – acessando de trás pra frente
a[2..4] # [99, 123, 456]
Explicando arrays
—  Arrays
         são definidos pela simples
  declaração de “[]”, como em “a = []”,
  também pode-se fazer “a = Array.new”;

—  Arrayssão acessados pelo índice, tanto
  positivo (ordem crescente) como
  negativo (ordem decrescente);

—  Quando se acessa um índice que não
  existe em um array, ele retorna “nil”;
Explicando arrays
—  Novos items podem ser colocados no array
  simplesmente utilizando o próprio operador
  “[]”, como em “a[10] = 10”;

—  Para
       se adicionar um item no fim do array
  usa-se o operador “<<“, como em “a <<
  10”;

—  Arrays
         podem ser pegos em ‘pedaços’ como
  em “a[1..3]”, que cria um novo array com os
  itens do índice 1 ao 3;
hashes
h = { 'dog' => 'canine', 'cat' => 'feline',
  'donkey' => 'asinine' }
h.length # 3
h['dog'] # "canine"
h['cow'] = 'bovine'
h[12] = 'dodecine'
h['cat'] = 99
Entendendo hashes
—  São
     conjuntos de “chave-valor” (Lembra
  do Map em Java?);

—  São
      declarados com o uso de “{}” como
  em “h = {}”, ou usando Hash.new;

—  Para
       se adicionar itens basta usar o
  operador [], como em “h[‘chave’] =
  ‘valor’”;
Você consegue explicar isso?
class SongList
  def with_title(title)
      for i in 0...@songs.length
             return @songs[i] if title ==
  @songs[i].name
      end
      return nil
  end
end
E isso?
class SongList
  def with_title(title)
      @songs.find {|song| title ==
  song.name }
  end
end
Código solto?
—  Blocossão pedaços de código que podem
  ser passados como parâmetros para
  funções, para fazer algum trabalho
  especial, como filtragem, ordenação e
  outros;

—  Você
      pode definir os seus próprios
  métodos que aceitam blocos;
Strings
'escape using ""' # escape using ""

'That's right' ! #That's right

"Seconds/day: #{24*60*60}" # Seconds/day:
  86400
def to_s
  “Song: #@song Artist: #{@artist}”
end
strings
#Q!String de muitas linhas com aspas
 duplas e acessando variáveis #{variavel}!

#q( String de muitas linhas com aspas
 simples, aqui não pode ter variável )

‘a’ << ‘b’ << ‘c’ # ‘abc’
Como é?
—  Strings
          são sequências de caracteres de 8
  bits, não necessariamente Unicode;

—  Elas
      podem ser definidas usando ‘’ (aspas
  simples) ou “” (aspas duplas);

—  Usando aspas duplas você pode colocar
  expressões ou variáveis com o uso do
  caracter “#” seguido de “{}” para variáveis de
  método ou funções ou apenas ‘@’ para
  variáveis de instância;
ranges
1..10 # [1,2,3,4,5,6,7,8,9,10]

'a'..'z‘ # lembra do alfabeto?

my_array = [ 1, 2, 3 ]

0...my_array.length # [0,1,2,3,4]

(1..10).to_a # [1, 2, 3, 4, 5, 6, 7, 8, 9,10]

('bar'..'bat').to_a # ["bar", "bas", "bat"]
O que são ranges?
—  São
      um conjunto de objetos em
  sequência, normalmente caracteres ou
  números;

—  São definidos através da declaração de
  [ ‘valor inicial’ .. ‘valor final’ ], como em
  [1..100];

—  Você
      pode definir os seus próprios ranges
  com o operador “<=>” (disco voador?);
Criando Seu próprio range
class VU include Comparable
   attr :volume
   def initialize(volume)
          @volume = volume
   end
   def to_s
          '#' * @volume
   end
   def <=>(other)
          self.volume <=> other.volume
   end
   def succ
          raise(IndexError, "Volume too big") if @volume >= 9
          VU.new(@volume.succ)
   end
end
Numeros
num = 81
6.times do
  puts "#{num.class}: #{num}"
  num *= num
end
Um pouco mais sobre métodos
def cool_dude(arg1="Miles", arg2="Coltrane",
  arg3="Roach")
  "#{arg1}, #{arg2}, #{arg3}."
end

cool_dude # "Miles, Coltrane, Roach."
cool_dude("Bart") # "Bart, Coltrane, Roach."
cool_dude("Bart", "Elwood") # "Bart, Elwood,
  Roach."
cool_dude("Bart", "Elwood", "Linus") # "Bart,
  Elwood, Linus."
Um pouco mais sobre métodos
def meth_three
 100.times do |num|
     square = num*num
     return num, square if square > 1000
 end
end

num, square = meth_three
Um pouco mais sobre metodos
def five(a, b, c, d, e)
 "I was passed #{a} #{b} #{c} #{d} #{e}"
end

five(1, 2, 3, 4, 5 ) # "I was passed 1 2 3 4 5"
five(1, 2, 3, *['a', 'b']) # "I was passed 1 2 3 a
   b"
five(*(10..14).to_a) # "I was passed 10 11
   12 13 14"
Ainda em métodos
class SongList
  def create_search(name, params)
      # ...
  end
end

list.create_search('short jazz songs',
       :genre => :jazz,
       :duration_less_than => 270)
If/unless
puts "a = #{a}" if debug

print total unless total.zero?

if x == 2
   puts x
elsif x < 0
   puts “#{x} é menor que zero”
else
   puts ‘Caiu no else’
end
Case/when (conhece o swiTch?)
leap = case
     when year % 400 == 0 then true
     when year % 100 == 0 then false
     else year % 4 == 0
     end
Que lindo switch
case input_line
  when "debug"
       dump_debug_info
       dump_symbols
  when /ps+(w+)/
       dump_variable($1)
  when "quit", "exit"
       exit
  else
       print "Illegal command: #{input_line}"
  end
while
print "Hellon" while false

begin
  print "Goodbyen"
end while false

while x < 10
  puts “X é #{x}”
  x=x+1
end
Quem precisa de um for?
3.times do
  print "Ho! “
end

0.upto(9) do |x|
  print x, " "
end

[ 1..5 ].each {|val| puts “ #{val} ” }
Mas você ainda quer um for?
for i in ['fee', 'fi', 'fo', 'fum']
  print i, " "
end

for i in 1..3
  print i, " "
end
Break, redo e next
while line = gets
 next if line =~ /^s*#/ # pular comentários
 break if line =~ /^END/ # parar no fim
 # executar coisas
 redo if line.gsub!(/`(.*?)`/) { eval($1) }
 # process line ...
end
Tente outra vez
for i in 1..100
  print "Now at #{i}. Restart? "
  retry if gets =~ /^y/i
end
DÚVIDAS?

Mais conteúdo relacionado

PDF
Curso java 06 - mais construtores, interfaces e polimorfismo
PPTX
Curso java 01 - molhando os pés com java
PDF
Curso java 05 - herança, classes e métodos abstratos
PDF
Curso java 04 - ap is e bibliotecas
PPTX
Herança e polimorfismo em Java
PDF
Orientação a objetos em Python (compacto)
PDF
Iteraveis e geradores
PDF
Objetos Pythonicos - compacto
Curso java 06 - mais construtores, interfaces e polimorfismo
Curso java 01 - molhando os pés com java
Curso java 05 - herança, classes e métodos abstratos
Curso java 04 - ap is e bibliotecas
Herança e polimorfismo em Java
Orientação a objetos em Python (compacto)
Iteraveis e geradores
Objetos Pythonicos - compacto

Mais procurados (18)

PDF
Orientação a Objetos em Python
PDF
Iteráveis e geradores (versão RuPy)
PDF
Python para quem sabe Python (aula 2)
PDF
Iteraveis e geradores em Python
ODP
Java 06 Strings Arrays
PDF
Java 07
PDF
Python: a primeira mordida
PPT
Java Desktop
PDF
Curso java 03 - métodos e parâmetros
PDF
Fugindo para as colinas com Python - Julio Biason - Tchelinux Bento Gonçalves...
PDF
Threads 04 Variáveis atômicas
PDF
Threads 06: Coleções concorrentes
PDF
Threads 07: Sincronizadores
PDF
Threads 09: Paralelismo
PDF
Threads 08: Executores e Futures
PPT
Java Básico :: Classe Vector
PDF
POO - 13 - Arrays em Java
PDF
Revisão de Classes e arquivos .java - Preparatório Certificação - OCAJP7 - Au...
Orientação a Objetos em Python
Iteráveis e geradores (versão RuPy)
Python para quem sabe Python (aula 2)
Iteraveis e geradores em Python
Java 06 Strings Arrays
Java 07
Python: a primeira mordida
Java Desktop
Curso java 03 - métodos e parâmetros
Fugindo para as colinas com Python - Julio Biason - Tchelinux Bento Gonçalves...
Threads 04 Variáveis atômicas
Threads 06: Coleções concorrentes
Threads 07: Sincronizadores
Threads 09: Paralelismo
Threads 08: Executores e Futures
Java Básico :: Classe Vector
POO - 13 - Arrays em Java
Revisão de Classes e arquivos .java - Preparatório Certificação - OCAJP7 - Au...
Anúncio

Semelhante a Aprendendo ruby (20)

ODP
Curso Ruby
PDF
Palestra Ruby
PPTX
Curso ruby on rails
PDF
Minicurso de Rails - WTISC 2014
PDF
Ruby
PDF
Introdução à programação em Ruby
ODP
Minicurso Ruby on Rails Dextra
PDF
Começando com Ruby - III SEICOM
PDF
Curso de introdução ao ruby
PPTX
Minicurso: Desenvolvimento na velocidade da luz com Ruby on Rails
PPTX
Ruby (1)
PDF
Workshop Ruby on Rails dia 1 ruby-pt
PDF
Ruby com Singleton class, Metaprogramação e muito mais
PDF
Introducao ao Ruby
PDF
Começando com ruby
PDF
Ruby - Criando código para máquinas e humanos
PDF
Crash Course Ruby & Rails
PDF
Apresentação ruby + rails 2014
PDF
Ruby para programadores java
PDF
Introdução a Linguagem Ruby
Curso Ruby
Palestra Ruby
Curso ruby on rails
Minicurso de Rails - WTISC 2014
Ruby
Introdução à programação em Ruby
Minicurso Ruby on Rails Dextra
Começando com Ruby - III SEICOM
Curso de introdução ao ruby
Minicurso: Desenvolvimento na velocidade da luz com Ruby on Rails
Ruby (1)
Workshop Ruby on Rails dia 1 ruby-pt
Ruby com Singleton class, Metaprogramação e muito mais
Introducao ao Ruby
Começando com ruby
Ruby - Criando código para máquinas e humanos
Crash Course Ruby & Rails
Apresentação ruby + rails 2014
Ruby para programadores java
Introdução a Linguagem Ruby
Anúncio

Mais de Maurício Linhares (20)

PPTX
Mercado de TI
PPTX
Unindo Ruby e Java através de uma arquitetura orientada a serviços na OfficeDrop
PPTX
Mixing Ruby and Java in a Service Oriented Architecture at OfficeDrop
PDF
Curso java 07 - exceções
PDF
Curso java 08 - mais sobre coleções
PDF
Curso java 02 - variáveis
PDF
Extreme programming
PDF
Feature Driven Development
PDF
Migrando pra Scala
PPTX
Outsourcing e trabalho remoto para a nuvem
PDF
Mercado hoje
PDF
Análise de sistemas oo 1
PDF
Revisão html e java script
PPTX
Aulas de Java Avançado 2- Faculdade iDez 2010
PPTX
Introdução ao desenvolvimento web - 2 - iDez 2010
PPTX
Aulas de Java Avançado 1 - Faculdade iDez 2010
PDF
Projeto e desenvolvimento de sistemas de informação 4 - computação em rede
PPT
Extreme programming explicada
PPT
Jdbc e hibernate
PPT
Mercado de TI
Unindo Ruby e Java através de uma arquitetura orientada a serviços na OfficeDrop
Mixing Ruby and Java in a Service Oriented Architecture at OfficeDrop
Curso java 07 - exceções
Curso java 08 - mais sobre coleções
Curso java 02 - variáveis
Extreme programming
Feature Driven Development
Migrando pra Scala
Outsourcing e trabalho remoto para a nuvem
Mercado hoje
Análise de sistemas oo 1
Revisão html e java script
Aulas de Java Avançado 2- Faculdade iDez 2010
Introdução ao desenvolvimento web - 2 - iDez 2010
Aulas de Java Avançado 1 - Faculdade iDez 2010
Projeto e desenvolvimento de sistemas de informação 4 - computação em rede
Extreme programming explicada
Jdbc e hibernate

Último (20)

PPTX
Panorama da aviação civil brasileira ANAC
PPTX
Formação aaaaaaaaadsdsfg er rsgrsgesf efsfsefsf e LEEI.pptx
PDF
Gestão contínua de exposição a ameaças petrobras
DOCX
Laboratório de cyber security, apresentação simples.
PDF
Apostila Power Automate Impressionador.pdf
PDF
Arquitetura de Software slides sommerville
PDF
POO - Aula 05 - Herança - Generalização e Especialização.pdf
PPTX
Google saiba mais sobre o google e suas funcionalidades
PDF
pdfcoffee.com_metalografia-25-pdf-free.pdf
PPTX
Importacao_Ordem_Customizacao_SAP_S4HANA.pptx
PDF
POO - Aula 03 - Membros Estáticos e Construtores.pdf
PPTX
AULA 1.pptx GESTÃO DE OPERAÇÕES INDUSTRIAIS
PPTX
RCSOFTdfsdfrvadfvdfvargfvevevrervevqer.pptx
PPTX
Introdução a Computação em Nuvem-parte2-T2
PDF
POO - Aula 05 - Herança - Generalização e Especialização.pdf
PPT
Padrões de Beleza I - Estética Corporal e Saúde
PDF
instalacoes eletricas para industria apressentacao basicas
PPT
01 - Arquitetura de Computadores 1 TEC [Salvo automaticamente].ppt
DOCX
20250828_Perfis Profissionais em ServiceNow Um Guia Detalhado.docx
PDF
T-pico 1.pdfnsjabdkaksbbsuendnijsbshajanzk
Panorama da aviação civil brasileira ANAC
Formação aaaaaaaaadsdsfg er rsgrsgesf efsfsefsf e LEEI.pptx
Gestão contínua de exposição a ameaças petrobras
Laboratório de cyber security, apresentação simples.
Apostila Power Automate Impressionador.pdf
Arquitetura de Software slides sommerville
POO - Aula 05 - Herança - Generalização e Especialização.pdf
Google saiba mais sobre o google e suas funcionalidades
pdfcoffee.com_metalografia-25-pdf-free.pdf
Importacao_Ordem_Customizacao_SAP_S4HANA.pptx
POO - Aula 03 - Membros Estáticos e Construtores.pdf
AULA 1.pptx GESTÃO DE OPERAÇÕES INDUSTRIAIS
RCSOFTdfsdfrvadfvdfvargfvevevrervevqer.pptx
Introdução a Computação em Nuvem-parte2-T2
POO - Aula 05 - Herança - Generalização e Especialização.pdf
Padrões de Beleza I - Estética Corporal e Saúde
instalacoes eletricas para industria apressentacao basicas
01 - Arquitetura de Computadores 1 TEC [Salvo automaticamente].ppt
20250828_Perfis Profissionais em ServiceNow Um Guia Detalhado.docx
T-pico 1.pdfnsjabdkaksbbsuendnijsbshajanzk

Aprendendo ruby

  • 2. O que? —  Do Japão ◦  Yukihiko “Matz” Matsumoto —  Trazida ao mundo ocidental pelos Pragmatic Programmers ◦  Andy Hunt e Dave Thomas (livro da machadinha) —  Completamente orientada a objetos ◦  Não existem tipos primitivos
  • 3. Como? —  Linguagem “de script” interpretada; —  Muito influenciada por Smalltalk e Perl; —  Contém conceitos de linguagens funcionais (closures – blocos de código); —  Completamente dinâmica (tudo pode mudar em tempo de execução);
  • 4. RVM – Ruby Version Manager —  Solução pra instalar vários interpretadores Ruby ao mesmo tempo na sua máquina; —  Possibilita criar aplicações completamente independentes no seu ambiente de desenvolvimento, isolando tudo e todos;
  • 5. Instalando o RVM —  Instale o Git na sua máquina —  bash < <(curl –s https://rvm.beginrescueend.com/install/rvm) —  Feche o console e abra outra vez —  rvm notes ◦  E faça o que ele mandar
  • 6. Instalando um Ruby com o RVM —  rvm install ruby-1.9.2 —  rvm use 1.9.2 —  rvm --default use 1.9.2
  • 7. Rubygems! —  gem install bundler rails —  ORubygems é o gerenciador de pacotes do Ruby, é com ele que você vai instalar as dependências da sua aplicação; —  Na sua máquina ele é chamado pelo comando “gem”;
  • 8. Bundler -> bundle install —  É quem garante que todas as dependências da sua aplicação estão disponíveis para que ela possa executar; —  Usaum arquivo chamando Gemfile onde você define as suas dependências e ele as instala usando o Rubygems; —  Garante que todos os desenvolvedores usam as mesmas coisas no trabalho;
  • 9. Começando a brincar com o IRB —  IRBé o “Interactive Ruby”, o console da linguagem; —  Pode-se enviar comandos ou se definir classes, módulos, funções e qualquer outra coisa pra se utilizar durante uma sessão;
  • 10. Brincando numero = 30 outro_numero = -20 numero + outro_numero numero + outro_numero.abs
  • 11. Primeiras tres regras de Ruby —  Nãose usam ‘;’ ou qualquer outra coisa pra indicar o fim de uma linha, o fim da linha é o fim da linha, oras; —  Variáveis não tem tipo, elas simplesmente guardam um objeto qualquer, de qualquer tipo; —  Quando nós vamos dar nomes a variáveis, normalmente separamos nomes compostos com “_”;
  • 12. Continuando a brincadeira, definindo um método def soma( primeiro, segundo) primeiro + segundo end soma( 10, 20) soma 50, 90
  • 13. Mais quatro regrinhas – 1 —  A definição de um método começa com “def” depois vem o nome do método e depois seus parâmetros entre parenteses; —  Blocosde código, como métodos, classes, “ifs” são sempre fechados com “end”, aqui não tem “{}” não;
  • 14. Mais quatro (5) regrinhas - 2 —  EmRuby não se usa “return”, se a última expressão no corpo de um método for avaliada para um valor, esse valor é retornado; —  O uso de parênteses não é obrigatório na chamada de métodos, mas tenha cuidado com a legibilidade; —  Bem, vocêainda pode usar “return” se quiser, mas é feio, oras;
  • 15. Classes class Song def initialize(name, artist, duration) @name = name @artist = artist @duration = duration end end musica = Song.new “Denied”, “Sonic Syndicate”, 3 musica.inspect
  • 16. Mais regras —  A definição de uma classe começa com a palavra “class”; —  As classes são sempre “abertas”, você pode redefinir os métodos de uma classe em qualquer lugar, é só declarar ela outra vez; —  Nomesde classe normalmente são definidos usando CamelCase (como em NomeDeClasse);
  • 17. Mais regras —  Os contrutores são os métodos “initialize ()”, que são invocados indiretamente, através do método de classe “new”; —  Nãoé possível fazer sobrecarga de construtores em Ruby =( ; —  Variáveis de instância tem o nome começado por “@”;
  • 18. Atributos class Song attr_writer :duration attr_reader :duration attr_acessor :title end song = Song.new("Bicylops", "Fleck", 260) song.duration = 257 song.title = ‘Triciclops’
  • 19. Regras denovo —  attr_reader define métodos de acesso a um atributo de instância de um objeto; —  attr_writer define métodos de alteraçao a um atributo de instância de um objeto, assim como o reader, ele cria a variável dentro do objeto; —  attr_acessor faz o mesmo que os dois anteriores juntos;
  • 20. Definindo atributos virtuais class Song def duration_in_minutes @duration/60.0 end def duration_in_minutes=(new_duration) @duration = (new_duration * 60).to_i end end
  • 21. O que é que nós fizemos? —  Criamosmétodos de acesso a um atributo, mas o cliente não sabe se são métodos ou se ele está acessando os atributos diretamente; —  Sobrescrevemos o operador “=“ (atribuição) para a nossa propriedade, Ruby tem sobrecarga de operadores (alguns, apenas)!
  • 22. Constantes,Variáveis e métodos de classe class SongList @@calls_total MAX_TIME = 5*60 # 5 minutos MIN_TIME = 1*60 # 1 minuto def SongList.is_too_long(song) song.duration > MAX_TIME end def self.is_too_short(song) song.duration < MIN_TIME end end
  • 23. E aí? —  Variáveis de classe são definidas com dois “@”, como em “@@variavel_de_classe”; —  Constantessão definidas com o seu nome completo em “caixa alta” (na verdade é só a primeira letra, mas use o NOME COMPLETO); —  Métodos de classe são definidos colocando o nome da classe antes do nome do método ou usando “self” (é o “this” em Ruby);
  • 24. acesso aos objetos class MyClass def method1 # o padrão é public end protected def method2 end private def method3 end public def method4 end end
  • 25. Como acessar? —  Osníveis de acesso são definidos em blocos, quando não há definição, é public, quando se quer definir um nível de acesso, deve-se utilizar um bloco de acesso; —  Um bloco termina assim que outro se iniciar;
  • 26. Mas não é ruim não ter tipos? Eu faço “quack()”, “nadar()” e “voar()”, igual a qualquer outro pato, eu sou ou não um pato?
  • 27. Tudo são mensagens! —  Pois é, você perdeu a aula de Smalltalk né? —  Nãoimporta qual o tipo do objeto, o que importa são as mensagens (métodos?) que ele é capaz de responder; —  Se faz quack, nada e voa feito um pato, então pra mim é um pato;
  • 28. Arrays a = [ 3.14159, "pie", 99 ] a[0] # 3.14159 a[3] # nil a << 123 # adicionando um item a[4] = 456 #adicionando outro item a[-1] # 456 – acessando de trás pra frente a[2..4] # [99, 123, 456]
  • 29. Explicando arrays —  Arrays são definidos pela simples declaração de “[]”, como em “a = []”, também pode-se fazer “a = Array.new”; —  Arrayssão acessados pelo índice, tanto positivo (ordem crescente) como negativo (ordem decrescente); —  Quando se acessa um índice que não existe em um array, ele retorna “nil”;
  • 30. Explicando arrays —  Novos items podem ser colocados no array simplesmente utilizando o próprio operador “[]”, como em “a[10] = 10”; —  Para se adicionar um item no fim do array usa-se o operador “<<“, como em “a << 10”; —  Arrays podem ser pegos em ‘pedaços’ como em “a[1..3]”, que cria um novo array com os itens do índice 1 ao 3;
  • 31. hashes h = { 'dog' => 'canine', 'cat' => 'feline', 'donkey' => 'asinine' } h.length # 3 h['dog'] # "canine" h['cow'] = 'bovine' h[12] = 'dodecine' h['cat'] = 99
  • 32. Entendendo hashes —  São conjuntos de “chave-valor” (Lembra do Map em Java?); —  São declarados com o uso de “{}” como em “h = {}”, ou usando Hash.new; —  Para se adicionar itens basta usar o operador [], como em “h[‘chave’] = ‘valor’”;
  • 33. Você consegue explicar isso? class SongList def with_title(title) for i in [email protected] return @songs[i] if title == @songs[i].name end return nil end end
  • 34. E isso? class SongList def with_title(title) @songs.find {|song| title == song.name } end end
  • 35. Código solto? —  Blocossão pedaços de código que podem ser passados como parâmetros para funções, para fazer algum trabalho especial, como filtragem, ordenação e outros; —  Você pode definir os seus próprios métodos que aceitam blocos;
  • 36. Strings 'escape using ""' # escape using "" 'That's right' ! #That's right "Seconds/day: #{24*60*60}" # Seconds/day: 86400 def to_s “Song: #@song Artist: #{@artist}” end
  • 37. strings #Q!String de muitas linhas com aspas duplas e acessando variáveis #{variavel}! #q( String de muitas linhas com aspas simples, aqui não pode ter variável ) ‘a’ << ‘b’ << ‘c’ # ‘abc’
  • 38. Como é? —  Strings são sequências de caracteres de 8 bits, não necessariamente Unicode; —  Elas podem ser definidas usando ‘’ (aspas simples) ou “” (aspas duplas); —  Usando aspas duplas você pode colocar expressões ou variáveis com o uso do caracter “#” seguido de “{}” para variáveis de método ou funções ou apenas ‘@’ para variáveis de instância;
  • 39. ranges 1..10 # [1,2,3,4,5,6,7,8,9,10] 'a'..'z‘ # lembra do alfabeto? my_array = [ 1, 2, 3 ] 0...my_array.length # [0,1,2,3,4] (1..10).to_a # [1, 2, 3, 4, 5, 6, 7, 8, 9,10] ('bar'..'bat').to_a # ["bar", "bas", "bat"]
  • 40. O que são ranges? —  São um conjunto de objetos em sequência, normalmente caracteres ou números; —  São definidos através da declaração de [ ‘valor inicial’ .. ‘valor final’ ], como em [1..100]; —  Você pode definir os seus próprios ranges com o operador “<=>” (disco voador?);
  • 41. Criando Seu próprio range class VU include Comparable attr :volume def initialize(volume) @volume = volume end def to_s '#' * @volume end def <=>(other) self.volume <=> other.volume end def succ raise(IndexError, "Volume too big") if @volume >= 9 VU.new(@volume.succ) end end
  • 42. Numeros num = 81 6.times do puts "#{num.class}: #{num}" num *= num end
  • 43. Um pouco mais sobre métodos def cool_dude(arg1="Miles", arg2="Coltrane", arg3="Roach") "#{arg1}, #{arg2}, #{arg3}." end cool_dude # "Miles, Coltrane, Roach." cool_dude("Bart") # "Bart, Coltrane, Roach." cool_dude("Bart", "Elwood") # "Bart, Elwood, Roach." cool_dude("Bart", "Elwood", "Linus") # "Bart, Elwood, Linus."
  • 44. Um pouco mais sobre métodos def meth_three 100.times do |num| square = num*num return num, square if square > 1000 end end num, square = meth_three
  • 45. Um pouco mais sobre metodos def five(a, b, c, d, e) "I was passed #{a} #{b} #{c} #{d} #{e}" end five(1, 2, 3, 4, 5 ) # "I was passed 1 2 3 4 5" five(1, 2, 3, *['a', 'b']) # "I was passed 1 2 3 a b" five(*(10..14).to_a) # "I was passed 10 11 12 13 14"
  • 46. Ainda em métodos class SongList def create_search(name, params) # ... end end list.create_search('short jazz songs', :genre => :jazz, :duration_less_than => 270)
  • 47. If/unless puts "a = #{a}" if debug print total unless total.zero? if x == 2 puts x elsif x < 0 puts “#{x} é menor que zero” else puts ‘Caiu no else’ end
  • 48. Case/when (conhece o swiTch?) leap = case when year % 400 == 0 then true when year % 100 == 0 then false else year % 4 == 0 end
  • 49. Que lindo switch case input_line when "debug" dump_debug_info dump_symbols when /ps+(w+)/ dump_variable($1) when "quit", "exit" exit else print "Illegal command: #{input_line}" end
  • 50. while print "Hellon" while false begin print "Goodbyen" end while false while x < 10 puts “X é #{x}” x=x+1 end
  • 51. Quem precisa de um for? 3.times do print "Ho! “ end 0.upto(9) do |x| print x, " " end [ 1..5 ].each {|val| puts “ #{val} ” }
  • 52. Mas você ainda quer um for? for i in ['fee', 'fi', 'fo', 'fum'] print i, " " end for i in 1..3 print i, " " end
  • 53. Break, redo e next while line = gets next if line =~ /^s*#/ # pular comentários break if line =~ /^END/ # parar no fim # executar coisas redo if line.gsub!(/`(.*?)`/) { eval($1) } # process line ... end
  • 54. Tente outra vez for i in 1..100 print "Now at #{i}. Restart? " retry if gets =~ /^y/i end