Ruby
Ruby

Criando código para máquinas e humanos.




          Gregório Chalinski Kusowski
        Ciência da Computação - Feevale
“Matz”




Yukihiro "Matz" Matsumoto
     @yukihiro_matz
História

  Ruby - 1993
Ruby Alpha - 1994
 Ruby 1.0 - 1996
   Rails - 2004
 Rails 1.0 - 2005
 Rails 2.0 - 2007
 Rails 3.0 - 2010
Variáveis
   a # escopo
   @a # instância
   $a # global
   @@a # classe


a = 1
@a, $a, @@a = 2, 3, 4
a # => 1
@a # => 2
$a # => 3
@@a # => 4
Métodos
          Declaração

def rua= (rua)
  @rua = rua
end
def numero= (numero)
  @numero = numero
end
def endereco
  return "#{@rua}, #{@numero}"
end
Métodos
             Utilização


rua=("Rua 5 de Abril")
numero=(321)

endereco() # => Rua 5 de Abril, 321



         10.*(5) # => 50
Estruturas de Controle
if valor < 7
  return "Reprovado"   unless pessoas.empty?
else                     puts pessoas.size
  return "Aprovado"    end
end


return valor < 7 ? "Reprovado" : "Aprovado"



 puts pessoas.size unless pessoas.empty?
Estruturas de Controle

def resultado(nota)
  case nota
  when (0..3); "Reprovado"
  when (3..7); "Recuperação"
  when (7..10); "Aprovado"
  else raise "Nota inválida"
  end
end
Estruturas de Controle

  for numero in (1..3)
    puts numero
  end

  (1..3).each do |numero|
    puts numero
  end
Classes

class   Jogo
  def   self.atual # classe
    #   ...
  end
  def   finalizar # instância
    #   ...
  end
end
Módulos
          module Time
            class Jogador
            end
          end

module Calculadora
  def media_aritmetica(valores = [])
    if valores.size > 0
      valores.sum / valores.size
    end
  end
end
Orientação a objetos
Em Ruby, não existem tipos primitivos.
    Qualquer coisa é um objeto:

          5.+(2) # => 7

       Qualquer coisa mesmo!


      foo = true
      foo.nil? # => false
      bar = nil
      bar.nil? # => true
Flexibilidade
       A linguagem não limita o programador.
Você pode adicionar funcionalidade, ou alterar o que já
                       existe!

        class String
           def carioqueish
              "#{self}sh"
           end
        end


        "Oi".carioqueish # => "Oish"
Paradigma Funcional
 Por in!uência da linguagem Lisp, Ruby conta com
estruturas de blocos, que funcionam como closures.

     a = lambda { "Sem Argumento" }


     b = Proc.new do |args|
       puts "Chamou b com: #{args}"
     end


     b.call("Argumento")
      # => "Chamou b com: Argumento"
Alguns tipos de dados
                 Strings

v= 1
"V: #{v}" # => "V: 1"
'V: #{v}' # => "V: #{v}"
%(Teste de String) # => "Teste de String"
%w(Teste de String)
 # => ["Teste", "de", "String"]
r = <<KEYWORD
Lorem ipsum dolor sit amet,
consectetur adipisicing elit
KEYWORD
Alguns tipos de dados
             Arrays
   a = Array.new
   b = [3]


   a << 1
   a.push 2


   a # => [1, 2]
   a + b # => [1, 2, 3]
   a.inject(:+) # => 3
Alguns tipos de dados
                   Arrays

telefones = pessoas.collect do |pessoa|
  pessoa.telefone
end # Lista de telefones

menores = pessoas.select do |pessoa|
  pessoa.idade < 18
end # Lista de pessoas

pessoas.select{|p| p.idade < 18}.collect{|p|
p.telefone} # Lista de telefones filtrada
Alguns tipos de dados
             Hashes

hash = Hash.new
outro_hash = {}
hash[:valor] = 555
endereco = {:rua => "5 de Abril",
            :numero => 321}

endereco[:rua] # => "5 de Abril"
endereco[:numero] # => 321
hash[:valor] # => 555
Syntax Sugar
Simpli"cando tanto a escrita, quanto a leitura.


       1.+(1)
       1+1
       conta.valores=('teste')
       conta.valores = 'teste'
       conta.imprime_extrato()
       conta.imprime_extrato
       if (condicao)
       if condicao
DRY
                          Don’t Repeat Yourself
   Java
public class Endereco {
  private String rua;
  private Integer numero;                     Ruby
  public String getRua() {
    return rua;
                                            class Endereco
  }
  public void setRua(String rua) {            attr_writer :rua
    this.rua = rua;                           attr_writer :numero
  }                                           attr_reader :rua
  public Integer getNumero() {
                                              attr_reader :numera
    return numero;
  }                                         end
  public void setNumero(Integer numero) {
    this.numero = numero;
  }
}
DRY
                          Don’t Repeat Yourself
   Java
public class Endereco {
  private String rua;
  private Integer numero;
  public String getRua() {
    return rua;                               Ruby
  }
  public void setRua(String rua) {          class Endereco
    this.rua = rua;
  }
                                              attr_accessor :rua, :numero
  public Integer getNumero() {              end
    return numero;
  }
  public void setNumero(Integer numero) {
    this.numero = numero;
  }
}
Não para por aí...

          Mixins
        Exceptions
    Meta-programação
         Threads
Implementações (JRuby, etc)
Referências
http://www.ruby-lang.org/
http://linuxdevcenter.com/pub/a/linux/2001/11/29/ruby.html
http://mislav.uniqpath.com/poignant-guide/book/
http://ruby-doc.org/
http://ruby-doc.org/docs/ProgrammingRuby/
http://www.informit.com/articles/article.aspx?p=18225
http://tarr.uspto.gov/servlet/tarr?regser=serial&entry=77119206
http://weblog.rubyonrails.org/2007/12/7/rails-2-0-it-s-done
http://weblog.rubyonrails.org/2010/8/29/rails-3-0-it-s-done
Obrigado
  pela
atenção!

Ruby - Criando código para máquinas e humanos

  • 1.
  • 2.
    Ruby Criando código paramáquinas e humanos. Gregório Chalinski Kusowski Ciência da Computação - Feevale
  • 3.
  • 4.
    História Ruby- 1993 Ruby Alpha - 1994 Ruby 1.0 - 1996 Rails - 2004 Rails 1.0 - 2005 Rails 2.0 - 2007 Rails 3.0 - 2010
  • 5.
    Variáveis a # escopo @a # instância $a # global @@a # classe a = 1 @a, $a, @@a = 2, 3, 4 a # => 1 @a # => 2 $a # => 3 @@a # => 4
  • 6.
    Métodos Declaração def rua= (rua) @rua = rua end def numero= (numero) @numero = numero end def endereco return "#{@rua}, #{@numero}" end
  • 7.
    Métodos Utilização rua=("Rua 5 de Abril") numero=(321) endereco() # => Rua 5 de Abril, 321 10.*(5) # => 50
  • 8.
    Estruturas de Controle ifvalor < 7 return "Reprovado" unless pessoas.empty? else puts pessoas.size return "Aprovado" end end return valor < 7 ? "Reprovado" : "Aprovado" puts pessoas.size unless pessoas.empty?
  • 9.
    Estruturas de Controle defresultado(nota) case nota when (0..3); "Reprovado" when (3..7); "Recuperação" when (7..10); "Aprovado" else raise "Nota inválida" end end
  • 10.
    Estruturas de Controle for numero in (1..3) puts numero end (1..3).each do |numero| puts numero end
  • 11.
    Classes class Jogo def self.atual # classe # ... end def finalizar # instância # ... end end
  • 12.
    Módulos module Time class Jogador end end module Calculadora def media_aritmetica(valores = []) if valores.size > 0 valores.sum / valores.size end end end
  • 13.
    Orientação a objetos EmRuby, não existem tipos primitivos. Qualquer coisa é um objeto: 5.+(2) # => 7 Qualquer coisa mesmo! foo = true foo.nil? # => false bar = nil bar.nil? # => true
  • 14.
    Flexibilidade A linguagem não limita o programador. Você pode adicionar funcionalidade, ou alterar o que já existe! class String def carioqueish "#{self}sh" end end "Oi".carioqueish # => "Oish"
  • 15.
    Paradigma Funcional Porin!uência da linguagem Lisp, Ruby conta com estruturas de blocos, que funcionam como closures. a = lambda { "Sem Argumento" } b = Proc.new do |args| puts "Chamou b com: #{args}" end b.call("Argumento") # => "Chamou b com: Argumento"
  • 16.
    Alguns tipos dedados Strings v= 1 "V: #{v}" # => "V: 1" 'V: #{v}' # => "V: #{v}" %(Teste de String) # => "Teste de String" %w(Teste de String) # => ["Teste", "de", "String"] r = <<KEYWORD Lorem ipsum dolor sit amet, consectetur adipisicing elit KEYWORD
  • 17.
    Alguns tipos dedados Arrays a = Array.new b = [3] a << 1 a.push 2 a # => [1, 2] a + b # => [1, 2, 3] a.inject(:+) # => 3
  • 18.
    Alguns tipos dedados Arrays telefones = pessoas.collect do |pessoa| pessoa.telefone end # Lista de telefones menores = pessoas.select do |pessoa| pessoa.idade < 18 end # Lista de pessoas pessoas.select{|p| p.idade < 18}.collect{|p| p.telefone} # Lista de telefones filtrada
  • 19.
    Alguns tipos dedados Hashes hash = Hash.new outro_hash = {} hash[:valor] = 555 endereco = {:rua => "5 de Abril", :numero => 321} endereco[:rua] # => "5 de Abril" endereco[:numero] # => 321 hash[:valor] # => 555
  • 20.
    Syntax Sugar Simpli"cando tantoa escrita, quanto a leitura. 1.+(1) 1+1 conta.valores=('teste') conta.valores = 'teste' conta.imprime_extrato() conta.imprime_extrato if (condicao) if condicao
  • 21.
    DRY Don’t Repeat Yourself Java public class Endereco { private String rua; private Integer numero; Ruby public String getRua() { return rua; class Endereco } public void setRua(String rua) { attr_writer :rua this.rua = rua; attr_writer :numero } attr_reader :rua public Integer getNumero() { attr_reader :numera return numero; } end public void setNumero(Integer numero) { this.numero = numero; } }
  • 22.
    DRY Don’t Repeat Yourself Java public class Endereco { private String rua; private Integer numero; public String getRua() { return rua; Ruby } public void setRua(String rua) { class Endereco this.rua = rua; } attr_accessor :rua, :numero public Integer getNumero() { end return numero; } public void setNumero(Integer numero) { this.numero = numero; } }
  • 23.
    Não para poraí... Mixins Exceptions Meta-programação Threads Implementações (JRuby, etc)
  • 24.
  • 25.