curso_ruby

Upload: regis-pires-magalhaes

Post on 08-Apr-2018

219 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/7/2019 curso_ruby

    1/114

    Curso de Ruby

    Regis Pires [email protected]

    A melhor forma de prever o futuro invent-lo.

    Alan Kay

  • 8/7/2019 curso_ruby

    2/114

    Overview Ruby histrico, caractersticas, implementaes,

    instalao, irb Entrada / Sada Comentrios Convenes Variveis, Constantes Operadores Tipos Estruturas de Controle Orientao a Objetos no Ruby

    Meta-programao Tratamento de Excees Mdulos Mixin Procs

    Fechamento ou Closure

  • 8/7/2019 curso_ruby

    3/114

    Ruby 1993 Yukihiro Matsumoto Matz Matz nasceu no Japo em 1965. Junta as melhores partes de gigantes

    do passado e do presente. Mais usada no Japo que Python. Popularizada pelo Rails.

  • 8/7/2019 curso_ruby

    4/114

    Ruby

    Segundo Matz:Ruby uma linguagem de scriptinginterpretada cujo objetivo tornar a

    programao orientada a objetos simples erpida. (...) simples, direta, extensvel eportvel.

    Fonte: http://www2.ruby-lang.org/en/20020101.html

  • 8/7/2019 curso_ruby

    5/114

    Ruby Caractersticas

    Dinmica; Tipagem forte; Livre / Open Source;

    Foco na simplicidade e produtividade; Programao divertida; Interpretada;

    Mixins, blocos e fechamentos; Totalmente orientada a objetos. Classes e objetos so abertos para

    redefinies a qualquer momento

  • 8/7/2019 curso_ruby

    6/114

    Implementaes do Ruby

    MRI Matz Runtime Interpreter JRuby Implementao em Java

    YARV Mquina Virtual Verso 1.9 Bytecode interpreter Rails 15% mais rpido que com Ruby 1.8.6

    Rubinius Extenses em Ruby IronRuby Implementao em .NET MagLev Ruby sobre VM da GemStone

    (excelente VM SmallTalk)

  • 8/7/2019 curso_ruby

    7/114

    Instalao do Ruby

    1 No Linux 2 alternativas: Compilar no brao:

    ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p22.tar.bz2

    tar xjvf ruby-1.8.7-p22.tar.bz2./configuremakemake install

    Via apt-get ou Synaptic (modo grfico) no Ubuntu:sudo apt-get install ruby rubygems irb ri

    rdoc ruby1.8-dev build-essential

    sudo apt-get install libmysql-ruby libpgsql-

    ruby libsqlite3-ruby

  • 8/7/2019 curso_ruby

    8/114

    Instalao do Ruby2 No Windows:

    One-Click Installer

    J vem com RubyGems, editor de textos e algunsoutros adicionais.

    http://rubyforge.org/frs/download.php/72085/rubyinstaller-1.8.7-p302.exe

  • 8/7/2019 curso_ruby

    9/114

    Instalao do Ruby

    3 No Windows ou Linux: Easy Rails = Ruby + Rails + Mongrel.

    Roda no Windows e Linux.

    http://rubyforge.org/frs/download.php/57834/e

    http://rubyforge.org/frs/download.php/72564/easy-rails-linux-0.9.3.md5

    http://rubyforge.org/frs/download.php/57834/easy-rails-0.9.5.exehttp://rubyforge.org/frs/download.php/57834/easy-rails-0.9.5.exe
  • 8/7/2019 curso_ruby

    10/114

    Testando o Ruby

    ruby -v

  • 8/7/2019 curso_ruby

    11/114

    irb - interactive ruby

    Interpretador interativo do Ruby. Permite executar trechos de cdigos Ruby,

    retornando o resultado de imediato.C:\InstantRails\rails_apps>irbirb(main):001:0> a=123=>123irb(main):002:0> b=456=>456irb(main):003:0> a*b=>56088irb(main):004:0>

  • 8/7/2019 curso_ruby

    12/114

    irb ativando o auto-complemento

    irb(main):010:0>require'irb/completion'=>true

    ~$ irb -r irb/completion

    Ao executar o irb:

    Com o irb j em execuo:

  • 8/7/2019 curso_ruby

    13/114

    Totalmente orientada a objetos

    No h tipos primitivos. Qualquer coisa que no seja executado

    dentro de um mtodo, est implicitamente

    sendo executado dentro do mtodo mainda classe Object.irb(main):001:0> puts self.classObject

    =>nilirb(main):002:0> puts selfmain=>nil

  • 8/7/2019 curso_ruby

    14/114

    Totalmente orientada a objetos

    1.class # => Fixnum1.class.class # => Class1.class.superclass # => Integer

  • 8/7/2019 curso_ruby

    15/114

    Totalmente orientada a objetos

    1 instncia da classe Fixnum. A classe Fixnum instncia da classe Class. Class define todas as classes em Ruby. Class uma metaclasse, ou seja, uma classe

    que descreve uma classe. Hierarquia:

    Classes: Object => Numeric => Integer => Fixnum Metaclasses: Object => Module => Class

  • 8/7/2019 curso_ruby

    16/114

    Totalmente orientada a objetos

    Todo valor um objeto e possui mtodos.1.to_s # => "1"1 + 1 # => 2

    1.+(1) # => 2-1.abs # => 1"123".length # => 3

  • 8/7/2019 curso_ruby

    17/114

    At mesmo classes so objetos.

    Exemplo.methods diferente deExemplo.new.methods.

    Totalmente orientada a objetos

    Object.class # => Class

    classExemplo; endExemplo.class # => ClassExemplo.methods # => [...]

  • 8/7/2019 curso_ruby

    18/114

    O mtodo methods

    1.methods.sort1.public_methods.sort1.protected_methods.sort1.private_methods.sort

    String.methods.sort

  • 8/7/2019 curso_ruby

    19/114

    Entrada / Sada

    nome = gets.chompPedro# => "Pedro"puts nome

    Pedro# => nil

    chomp mastigar, roer

  • 8/7/2019 curso_ruby

    20/114

    Comentrios

    x = y + 5 # Isto um comentrio de linha.# Isto um outro comentrio de linha.

    =beginIsto um comentrio de bloco.

    =end

  • 8/7/2019 curso_ruby

    21/114

    Convenes

    NomesDeClassenomes_de_metodos e nomes_de_variaveis

    metodos_fazendo_pergunta?

    metodos_perigosos!

    @variaveis_de_instancia

    @@variaveis_de_classe

    $variaveis_globais

    ALGUMAS_CONSTANTES ou OutrasConstantes

  • 8/7/2019 curso_ruby

    22/114

    Variveis

    So tipadas dinamicamente: a = 4 So fortemente tipadas: 2 + "2" no possvel.

    Variveis locais: quantidade_dias = 3

    Variveis globais:$caminho = "/home/curso"

    Variveis de instncia: @nome = "Maria"

    Variveis de classe:

    @@vogais = ['a', 'e', 'i', 'o', 'u']

  • 8/7/2019 curso_ruby

    23/114

    Variveis

    Variveis no precisam ser declaradas. Variveis so referncias para objetos.

    ~$ irbirb(main):001:0> a = 1=>1irb(main):002:0> a = "1"=>"1"'

  • 8/7/2019 curso_ruby

    24/114

    Operadores

    Aritmticos:+, -, *, /, %, ** ... etc Igualdade e comparao:>, >=,

  • 8/7/2019 curso_ruby

    25/114

    Operadores

    Operador de comparao. Retorna -1, 0 ou 1 se formenor, igual ou maior que seu argumento.

    =~

    Usado para associar padres em expressesregulares.

    'Curso de Ruby' =~ /de/# => 6

    ||=

    cont ||= 0 # cont = cont || 0

    Atribui um valor apenas se a varivel estiver vazia. Resulta em 0 se cont no tiver um valor.

  • 8/7/2019 curso_ruby

    26/114

  • 8/7/2019 curso_ruby

    27/114

    Tipos

    Nmeros Booleanos nil

    Strings Ranges [Arrays] {Hashes} :simbolos

    Expresses Regulares

  • 8/7/2019 curso_ruby

    28/114

  • 8/7/2019 curso_ruby

    29/114

  • 8/7/2019 curso_ruby

    30/114

    Booleanos H somente 2 instncias que representam valores

    booleanos em Ruby: true e false.

    true.class # => TrueClassfalse.class # => FalseClass

    true.class.superclass # => Objectfalse.class.superclass # => ObjectTrueClass.newNoMethodError: undefined method `new'

    for TrueClass:Classfrom (irb):17

    from :0

  • 8/7/2019 curso_ruby

    31/114

    nil

    O valor nulo representado pelo objetonil da classe NilClass.

    nil.class # => NilClass

    nil.class.superclass # => ObjectNilClass.new

    NoMethodError: undefined method`new'

    for NilClass:Classfrom (irb):21

    from :0

  • 8/7/2019 curso_ruby

    32/114

    Strings

    String apenas uma sequncia de bytes. Pode carregar caracteres "imprimveis" ou dados

    binrios.

    Podem ser delimitadas por aspas'simples'

    ou "duplas".

    Podem ocupar vrias linhas, sem precisar ficarconcatenando.

  • 8/7/2019 curso_ruby

    33/114

  • 8/7/2019 curso_ruby

    34/114

    Strings Mtodos Destrutivos

    a = "Ruby" # => "Ruby"a.object_id # => 20641550a.upcase # => "RUBY"a # => "Ruby"a.upcase! # => "RUBY"a # => "RUBY"a.object_id # => 20641550

    a.downcase! # => "ruby"a # => "ruby"

  • 8/7/2019 curso_ruby

    35/114

  • 8/7/2019 curso_ruby

    36/114

  • 8/7/2019 curso_ruby

    37/114

    Strings longas

    nome = "Descartes"s =

  • 8/7/2019 curso_ruby

    38/114

  • 8/7/2019 curso_ruby

    39/114

  • 8/7/2019 curso_ruby

    40/114

    Strings - Mtodos

    s = "Ruby on Rails"s.gsub(' ','-') # => "Ruby-on-Rails"s.gsub(/[aeiou]/,'_') # => "R_by _n R__ls"

    s.index('on') # => 5

    "hello\r\n".chomp #=> "hello""hello \n there".chomp #=> "hello \n there""hello".chomp("llo") #=> "he"

    s='Ruby on Rails's[5,2] # => "on"

    s[5..6]# => "on ""Ruby".reverse # => "ybuR"

  • 8/7/2019 curso_ruby

    41/114

    Ranges um tipo da linguagem que representa

    um intervalo de valores: crianca = 0..10

    1..7 inclui 1, 2, 3, 4, 5, 6 e 7

    1...7 no inclui o 7"Ruby"[1..2] # --> "ub"

    [1,2,3,4,5][1..2] # --> [2,3]

    (2..10) === 3 # true("a".."z").each {|i| puts i}

    for n in5..10; puts n; end

  • 8/7/2019 curso_ruby

    42/114

    [Arrays] Guardam uma coleo de objetos, cada um

    em uma posioa = [10, 7.2, "Maria"]a.class # Array

    a[1] # 7.2a.length # 3a[-1] # "Maria"a [nil, nil, nil, nil, "Ruby"]

  • 8/7/2019 curso_ruby

    43/114

  • 8/7/2019 curso_ruby

    44/114

    [Arrays]

    a=[1,2,3,4,5]

    putsa12345

    putsa.inspect[1,2,3,4,5]

    %

  • 8/7/2019 curso_ruby

    45/114

    %w array de palavras

    a = %w(curso de ruby on rails)

    => ["curso","de","ruby","on","rails"]

    nome, sobrenome = 'regis', 'pires'

    a = %w(#{nome} #{sobrenome})=> ["\#{nome}", "\#{sobrenome}"]

    a = %W(#{nome} #{sobrenome})=> ["regis", "pires"]

    A

  • 8/7/2019 curso_ruby

    46/114

    Arrays

    s = 'Ruby on Rails's.split(' ') # => ["Ruby", "on", "Rails"]

    a = %w(um dois tres quatro cinco seis seteoito nove dez)

    => ["um", "dois", "tres", "quatro","cinco", "seis", "sete", "oito", "nove","dez"]a.grep(/s$/)=> ["dois", "tres", "seis"]

    A d b t

  • 8/7/2019 curso_ruby

    47/114

    Array de bytes

    b='Ruby'.bytes.to_a# => [82, 117, 98, 121]

    b.pack("c*") # => "Ruby"

    {H h }

  • 8/7/2019 curso_ruby

    48/114

    {Hashes} O mesmo que arrays associativos, mapas ou

    dicionrios Cada entrada composta por uma chave

    (nica) e um valora = {'um' =>1, 'bola' =>2, 3 =>'Maria'}

    a.class => Hash

    a[1] =>nil

    a['um'] =>1

    a.length =>3

    a = Hash.new

    a = {}

    i b l

  • 8/7/2019 curso_ruby

    49/114

    :simbolos

    Identificador que corresponde a um nome. H apenas uma instncia de cada um deles."vermelho".object_id != "vermelho".object_id

    :vermelho.object_id == :vermelho.object_id

    So muito usados como chave nos Hashespessoa = {:nome =>'Regis', :idade =>17,

    :profissao =>'Professor'} Imutveis

    i b l

  • 8/7/2019 curso_ruby

    50/114

    :simbolos

    :nome.to_s # => "nome"

  • 8/7/2019 curso_ruby

    51/114

    E t t d C t l

  • 8/7/2019 curso_ruby

    52/114

    Estruturas de Controle Falso

    falseenil

    then opcional no if e unless

    if elsif else end:

    if (1 != 2)

    puts "Um nao eh dois"

    end

    unless else end:unless (1 == 2)

    puts "Um nao eh dois"

    end

    E t t d C t l

  • 8/7/2019 curso_ruby

    53/114

    Estruturas de Controle

    puts 'ola' if not a or not b

    puts 'oi' unless y != 3

    if x < 5 thenputs 'menor que 5'end

    x = if a>0 then b else c end

    x = unless a

  • 8/7/2019 curso_ruby

    54/114

    Estruturas de Controle

    case when else end:case a

    when1:'Um'

    else'Outro'

    end

    E t t d C t l

  • 8/7/2019 curso_ruby

    55/114

    Estruturas de Controle

    casescale when'C','c' F=1.8 * temp+32 when'F','f'

    C=(5.0/9.0) * (temp-32)else abort"Must specify C or F."

    end

    E t t d C t l

  • 8/7/2019 curso_ruby

    56/114

    Estruturas de Controle

    do opcional no while, until e for while end:

    a = 0

    while a < 5a += 1puts a

    end

    for in end:for a in'a'..'f'puts a

    end

    E t t d C t l

  • 8/7/2019 curso_ruby

    57/114

    Estruturas de Controle

    list=[1,2,3]i=0whilei

  • 8/7/2019 curso_ruby

    58/114

    Mtodos

  • 8/7/2019 curso_ruby

    59/114

    Mtodos Sempre retornam alguma coisa

    Se um valor no for explicitamente retornado, nil usado implicitamente.

    O return opcionaldefsoma(a,b)a + b

    end

    Chamamos assim:

    soma(1,2) ou soma 1, 2

    Mtodos

  • 8/7/2019 curso_ruby

    60/114

    Mtodos

    Os parmetros podem ter valoresopcionais ou default:defsoma(a, b=1)

    a + b

    endsoma(1,1) == soma(1)

    Array como lista de parmetros de um

    mtodovalores = [1,2]

    soma(*valores)

    Mtodos

  • 8/7/2019 curso_ruby

    61/114

    Mtodos Os parmetros podem ter quantidade variada

    (varargs):defcampeao(time, *anos)puts "O #{time} foi campeo #{anos.size} vezes"

    end

    campeao('Brasil', 1958, 1962, 1970, 1994, 2002)

    Hashes so usados como parmetro quando a lista grande ou variada!

    open "teste.txt", :create=>true, :reset=>false

    Retornando "vrios valores" (arrays):

    nome, sobrenome = "Regis Pires".split(' ')

  • 8/7/2019 curso_ruby

    62/114

    Date

  • 8/7/2019 curso_ruby

    63/114

    Date

    require'date'c = Date.todayd = Date.new(2010, 10, 21)# => #d.day # => 21

    d.mon # => 10d.month # => 10d.year # => 2010d.wday # => 4

    d.mday # => 21d.yday # => 294d.to_s # => "2010-10-21"dt = DateTime.nowt = Time.now

    Arquivos

  • 8/7/2019 curso_ruby

    64/114

    Arquivos

    f=File.new("teste.txt","w")f

  • 8/7/2019 curso_ruby

    65/114

    UDP Server

    require'socket'porta=12345s=UDPSocket.news.bind("localhost",porta)puts"Servidor iniciado na porta #{porta}..."

    loopdo msg,sender=s.recvfrom(256) host=sender[3] puts"Host #{host} enviou um pacote UDP: #{msg}"ends.close

  • 8/7/2019 curso_ruby

    66/114

    Blocos

  • 8/7/2019 curso_ruby

    67/114

    Blocos Um conjunto de instrues

    So delimitados por{...} ou do...end.

    Conveno: use {...} em uma s linha, e

    do...endpara vrias linhas. Podem receber parmetros:

    meu_array.each { |obj| puts obj }

    (1..10).each {|i| puts i}("a".."z").each {|i| puts i}

    Blocos

  • 8/7/2019 curso_ruby

    68/114

    Blocos

    Podem ser passados como parmetro:5.times { puts 'ol' }

    Podem receber parmetros:5.times { |n| puts 'ol ' + n.to_s }

    Podem ser convertidos em objetos:

    Proc.new ou proc ou lambda. Muito usados no Ruby!

    Arquivos com blocos de cdigo

  • 8/7/2019 curso_ruby

    69/114

    Arquivos com blocos de cdigo

    File.open("teste.txt",'w')do|f| f

  • 8/7/2019 curso_ruby

    70/114

    Orientao a Objetos no Ruby

    Classes e Objetos Getters e Setters Variveis de classe e de instncia Mtodos de classe e de instncia Herana

    Visibilidade dos Membros

  • 8/7/2019 curso_ruby

    71/114

    Classes e Objetos

  • 8/7/2019 curso_ruby

    72/114

    Classes e Objetos "Bola", 'Casa', 'b' so instncias da classe String.

    Usamos o ponto (.) para acessar os mtodos:@pessoa.nome.

    Instanciamos um objeto atravs do "mtodo

    construtor" da sua classe:p = Pessoa.new 'Maria', 54

    Para alguns tipos bsicos, no precisamos fazer

    isso:a = "Bola"; b = 3; c = [1, 2, 9]

    Classes e Objetos

  • 8/7/2019 curso_ruby

    73/114

    Classes e Objetos

    classPessoa definitialize(nome, idade)

    @nome = nome@idade = idade

    enddefto_s"#{@nome} tem#{@idade} anos"

    end

    end

    p1 = Pessoa.new("Paulo", 12)p2 = Pessoa.new("Marcio", 34)

    Classes e Objetos

  • 8/7/2019 curso_ruby

    74/114

    Classes e Objetos

    O mtodo initialize executadoautomaticamente quando new usado.

    initialize automaticamente definido como

    private.

    Getters e Setters

  • 8/7/2019 curso_ruby

    75/114

    Getters e Setters Para permitir o acesso aos atributos, definimos

    mtodos. Ou utilizamos 'atalhos' para isso: attr_reader,attr_writter, attr_accessor.

    Getters e Setters

  • 8/7/2019 curso_ruby

    76/114

    Getters e Setters classPessoa

    definitialize(nome, idade) @nome = nome @idade = idade end

    defnome=(nome) @nome = nome end defnome

    @nome end

    attr_accessor :idade end

  • 8/7/2019 curso_ruby

    77/114

    Variveis de classe e de instncia

  • 8/7/2019 curso_ruby

    78/114

    Variveis de classe e de instncia

    classPessoa

    @@numero_pessoas = 0# Atrib de classe

    definitialize (nome, idade) @nome = nome # Atrib.de instncia

    @idade = idade @@numero_pessoas += 1 end

    defnumero_pessoas @@numero_pessoas end

    end

    Mtodos de classe e de instncia

  • 8/7/2019 curso_ruby

    79/114

    Mtodos de classe e de instncia Mtodos tambm podem pertencer ao escopo de

    classe ou de instncia. Mtodos de classe no acessam atributos de

    instncia.

    Mtodo de instncia: p.dados. Mtodo de classe: Pessoa.numero_pessoas

    ou self.numero_pessoas

    O uso de self facilita a alterao do nome da classe,evitando que a alterao tambm tenha que serrealizada nos mtodos de classe.

    Observe que o new um mtodo de classe!

    Mtodos de classe

  • 8/7/2019 curso_ruby

    80/114

    Mtodos de classe Mtodos de classe como Math.sin e

    File.delete so na verdade mtodos desingleton, pois esto disponveis apenas emum nico objeto.

    Singleton, um padro de projeto (DesignPattern) que garante a existncia de apenas umainstncia de uma classe, mantendo um pontoglobal de acesso ao seu objeto.

    Math uma constante que referencia um objetoModule.

    File uma constante que referencia um objeto

    Class.

    Mtodos de classe e de instncia

  • 8/7/2019 curso_ruby

    81/114

    Mtodos de classe e de instncia

    classPessoa

    @@numero_pessoas = 0definitialize (nome, idade)

    @nome = nome@idade = idade

    @@numero_pessoas += 1 end defself.numero_pessoas @@numero_pessoas end

    endp = Pessoa.new 'Joao', 23p2 = Pessoa.new 'Maria', 21Pessoa.numero_pessoas # => 2p.to_s # => "Joao tem 23 anos"

    Mtodos de uma nica instncia

  • 8/7/2019 curso_ruby

    82/114

    Mtodos de uma nica instncia

    Tambm possvel escrever um mtodo paraum nico objeto!p1 = Pessoa.new 'Joao', 23p2 = Pessoa.new 'Maria', 21

    defp1.apresentacao "Ol, sou o #{@nome}" end

    p1.apresentacao # => "Ol, sou o Joao"p2.apresentacao # => NoMethodError: ...

    Herana

  • 8/7/2019 curso_ruby

    83/114

    Herana Utilizamos quando queremos especializar

    uma classe. A classe mais genrica chamada de

    super-classe, e a mais especfica de sub-

    classe. Em Ruby existe apenas herana simples,

    embora possamos simular herana

    mltipla atravs de mixins. O super chama o correspondente da

    super-classe.

    Herana

  • 8/7/2019 curso_ruby

    84/114

    Herana

    classB < Aend

    Herana

  • 8/7/2019 curso_ruby

    85/114

    Herana

    classPessoaFisica < Pessoadefinitialize (nome, idade, cpf)

    super(nome, idade) @cpf = cpf

    end

    # Mtodo dados redefinidodefto_s

    super + ", Cpf=#{@cpf}"end

    end

    Visibilidade dos Membros

  • 8/7/2019 curso_ruby

    86/114

    Visibilidade dos Membros Os mtodos podem ser:

    Pblicos - chamados por qualquer um. Protegidos - chamados apenas pela famlia. Privados chamados apenas no contexto do

    objeto atual. Em Ruby os atributos so sempre privados! public, protectede private so

    mtodos que modificam a classedinamicamente e mantm o escopo deacesso at que outro escopo seja chamado.

    Visibilidade dos Membros

  • 8/7/2019 curso_ruby

    87/114

    Visibilidade dos Membros classMinhaClasse # Pblico o default defmetodo1

    ... end

    protected # os seguintes sero protegidos defmetodo2

    ... end

    private # os seguintes sero privados defmetodo3

    ... end

    public # os seguintes sero pblicos defmetodo4

    ... end

    end

    Visibilidade dos Membros

  • 8/7/2019 curso_ruby

    88/114

    Visibilidade dos Membros Tambm possvel fazer assim: classMinhaClasse defmetodo1

    ... end

    # os outros mtodos

    public :metodo1, :metodo4

    protected:metodo2private :metodo3

    end

    Meta-programao

  • 8/7/2019 curso_ruby

    89/114

    Meta programao

    Cao = Class.new

    Cao.class_eval nil

    Au, Au

    Programao de programas que escrevem oumanipulam outros programas (ou a si prprios)

  • 8/7/2019 curso_ruby

    90/114

  • 8/7/2019 curso_ruby

    91/114

  • 8/7/2019 curso_ruby

    92/114

    Tratamento de Excees

  • 8/7/2019 curso_ruby

    93/114

    begin . . . rescue . . . ensure . . . endbegin

    z = x/y rescue TypeError => err

    print "Erro de tipo" rescue => err

    print "Erro Geral" ensure

    z = 3end

  • 8/7/2019 curso_ruby

    94/114

    Mdulos

  • 8/7/2019 curso_ruby

    95/114

    # No arquivo calc.rb

    moduleCalcPI = 3.141592654 defself.seno(x)

    puts "calc.seno de #{x}" end

    defself.cosseno(x)puts "calc.cosseno de #{x}" endend

    # Em outro programa carregamos o arquivo# calc.rb usando require 'calc'

    # Chamamos mtodos com "." e constantes com "::"y = Calc.seno(Calc::PI / 4)

    Mixin

  • 8/7/2019 curso_ruby

    96/114

    Recurso que permite a injeo de novos mtodos a

    classes ou instncias.moduleDebug defquem_sou_eu? "#{self.class.name}: #{self.to_s}" end

    endclassLivroinclude Debug

    endclassPessoaFisica < Pessoa

    include Debugendlivro = Livro.new("Programming Ruby")livro.quem_sou_eu? # => "Livro: Programming Ruby"pessoa = PessoaFisica.new("Jose", 22)pessoa.quem_sou_eu? # => "PessoaFisica: Jose, 22"

    Mixin

  • 8/7/2019 curso_ruby

    97/114

    moduleMyArray defhello

    puts "Oi!#{self.length}"if self.respond_to? :length endendclassStringinclude MyArray

    endclassArrayinclude MyArray

    endstr = 'teste'arr = [1,2,3]

    str.hello # "Oi!5"arr.hello # "Oi!3"

    Carregamento de classes e mdulos

  • 8/7/2019 curso_ruby

    98/114

    g

    load

    Carrega um arquivo tantas vezes quanto sejaexecutado.

    load 'irb/completion.rb'

    require Carrega uma biblioteca, caso no tenha sido

    carregada ainda. require 'irb/completion'

    include

    Faz o mixin de um ou mais mdulos. include Modulo1, Modulo2

    Procs

  • 8/7/2019 curso_ruby

    99/114

    So blocos de cdigo associados uma varivel.

    Procs encapsulam blocos em objetos.

    Pode-se usarProc.new, proc ou lambda.

    vezes3 = Proc.new {|n| n*3}vezes3.call(1)=>3vezes3.call(2)

    =>6vezes3.call(3)=>9

    Procs

  • 8/7/2019 curso_ruby

    100/114

    Podemos transformar um bloco de cdigo emuma Proc usando lambda ou proc:vezes3 = lambda {|n| n*3}vezes3.call(1)

    =>3vezes3.call(2)=>6vezes3.call(3)=>9

    Fechamento ou Closure

  • 8/7/2019 curso_ruby

    101/114

    um bloco de cdigo que pode ser passado comoargumento a uma chamada de mtodo.

    Closures podem fazer referncia a variveis visveis nomomento em que elas foram definidas.

    Closure = bloco de cdigo + ligaes ao ambiente doqual vieram.

    So mtodos annimos com escopo fechado.

    So mtodos que carregam o contexto no qual foramcriados.

    O bloco pode usar todas as informaes do seu contextooriginal mesmo que o ambiente no qual ele foi definido

    no mais exista

  • 8/7/2019 curso_ruby

    102/114

    Fechamento ou Closure

  • 8/7/2019 curso_ruby

    103/114

    classArray

    defeach2 for element inself

    yieldelement end

    endenda = [1,2,3]a.each2 { |i| puts i }

  • 8/7/2019 curso_ruby

    104/114

    Fechamento ou Closure

  • 8/7/2019 curso_ruby

    105/114

    defn_vezes(algo)Proc.new {|n| algo * n }endp1 = n_vezes 2p1.call(3)=>6p1.call(4)=>8p2 = n_vezes 'Oi '

    p2.call(3)=>"Oi Oi Oi "

    Gem

  • 8/7/2019 curso_ruby

    106/114

    Uma gem um pacote contendo uma bibliotecaou aplicao Ruby.

    Rubygems o projeto que desenvolveu osistema de pacotes gem.

    Simplifica bastante a instalao de bibliotecasem Ruby.

    Listando as gems existentes:

    gem list Adicionando uma nova fonte de gems:

    gem sources -a http://gems.github.com

    Testes

  • 8/7/2019 curso_ruby

    107/114

    "Sempre que estiver tentado a escrever umprintou uma expresso de depurao,escreva um teste."

    Martin Fowler

    Testes

  • 8/7/2019 curso_ruby

    108/114

    classRetangulo definitialize(base,altura) @base=base @altura=altura end

    defarea() @base*@altura end

    defperimetro()

    2*@base+2*@altura endend

    Testes com RUnit

  • 8/7/2019 curso_ruby

    109/114

    # retangulo_test.rbrequire'test/unit'

    require'retangulo'

    classRetanguloTest

  • 8/7/2019 curso_ruby

    110/114

    Rspec Instalando gems

  • 8/7/2019 curso_ruby

    111/114

    gem install rspec -V Para quem usa Ruby on Rails:

    gem install rspec-rails -V

  • 8/7/2019 curso_ruby

    112/114

  • 8/7/2019 curso_ruby

    113/114

    Referncias

  • 8/7/2019 curso_ruby

    114/114

    Slides do Lucas de Castro sobre Ruby

    Agile Web Development with Rails. 2 Edio. Thomas e David Heinemeier Hansson.

    Conceitos de Ruby e Rails

    Gabriel Boga Perez (http://www.b2t.com.br) Tutorial de Ruby do TaQ

    http://www.eustaquiorangel.com/downloads/tutorialruby.pdf

    Crossing borders: Closures Bruce Tate http://www.ibm.com/developerworks/java/library/j-

    cb01097 html