curso_ruby
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