5. Ruby é...
“Uma linguagem dinâmica, open source com
foco na simplicidade e na produtividade.Tem
uma sintaxe elegante de leitura natural e
fácil escrita.
http://www.ruby-lang.org/pt/ 5
6. Instalando Ruby
(Ubuntu)
$ sudo apt-get install ruby irb
Lendo lista de pacotes... Pronto
Construindo árvore de dependências
Lendo estado da informação... Pronto
Os pacotes extra a seguir serão instalados:
irb1.8 libreadline-ruby1.8 libruby1.8 ruby1.8
Pacotes sugeridos:
rdoc1.8 ri1.8 ruby1.8-examples
Os NOVOS pacotes a seguir serão instalados:
irb irb1.8 libreadline-ruby1.8 libruby1.8 ruby ruby1.8
0 pacotes atualizados, 6 pacotes novos instalados,
(...)
Instalando irb (4.1) ...
Instalando ruby (4.1) ...
Processing triggers for libc6 ...
ldconfig deferred processing now taking
$
6
8. Linguagem de Script
como python, perl e bash
$ ls
Code Library
Sentilla iLiberty+ Payloads
workspace
Desktop Music
Snapshots liferay
Documents Pictures
TryLock.txt pgadmin.log
$ echo "viva a bahia"
viva a bahia
$ i=$(date)
Em BASH, os comandos
$ echo $i podem ser executados no
interpretador (prompt) e o
Sat Mar 21 15:19:37 BRT 2009
resultado obtido
imediatametne...
$ 8
9. Linguagem de Script
.sh
$ cat teste.sh
ls ... ou os comandos podem
ser todos executados de
echo "viva a bahia" uma só vez (bash script)
i=$(date)
echo $i
$ bash teste.sh
Code Library
Sentilla iLiberty+ Payloads
teste.sh
Desktop Music
Snapshots liferay
Documents Pictures
TryLock.txt pgadmin.log
viva a bahia
Sat Mar 21 15:25:07 BRT 2009
9
$
10. Interpretador Ruby
irb
$ irb
irb(main):001:0> puts "viva a bahia"
viva a bahia
=> nil
irb(main):002:0> a = 9
=> 9 Assim como no BASH, os
comandos Ruby podem ser
irb(main):003:0> puts a executados no interpretador
(Ruby) e o resultado obtido
9 imediatametne...
=> nil
irb(main):004:0> Time.now
=> Sat Mar 21 15:33:49 -0300 2009
10
11. Interpretador Ruby
.rb
$ cat teste.rb
puts "viva a bahia"
a = 9
... ou os comandos podem
puts a ser todos executados de
puts Time.now uma só vez (script ruby)
$ ruby teste.rb
viva a bahia
9
Sat Mar 21 15:40:17 -0300 2009
11
20. então, tudo é objeto e troca
de mensagem entre eles
irb(main):034:0> 1+2
=> 3
irb(main):035:0> 3*5
=> 15
repare que +, -, *, / ...
são métodos do objeto
da classe Fixnum
20
27. @variable
def
while until
Sintaxe Ruby
for
end
class
do
<
attr_accessor
27
28. Métodos
def soma a, b
a+b
end
puts soma 3, 4
28
29. Classe
numero.rb
class Numero
# atributos
# metodos
end
29
30. Classe
construtor
class Numero
def initialize v
@valor = v
end
end
irb(main):001:0> require 'numero'
=> true
irb(main):002:0> n = Numero.new 1
=> #<Numero:0x54ec0 @v=1>
30
31. Classe
accessors
class Numero
def initialize v
@valor = v
end
end
irb(main):001:0> require 'numero'
=> true
irb(main):002:0> n = Numero.new 1
=> #<Numero:0x54e98 @valor=1>
irb(main):003:0> n.valor
NoMethodError: undefined method `valor'
for #<Numero:0x54e98 @valor=1>
from (irb):3
31
32. Classe
accessors
class Numero
def initialize v
@valor = v
end
attr_accessor :valor
end
irb(main):002:0> require 'numero'
=> true
irb(main):003:0> n = Numero.new 1
=> #<Numero:0x500a0 @valor=1>
irb(main):004:0> n.valor
=> 1
32
33. Classe
herança
funcionario.rb
pessoa.rb
class Pessoa class Funcionario < Pessoa
def initialize nome def initialize n, m
@nome = nome super n
end @matricula = m
end
attr_accessor :nome
attr_accessor :matricula
end
end
require 'pessoa'
require 'funcionario'
p = Pessoa.new 'Alexandre'
puts "A pessoa #{p.nome} foi criada"
f = Funcionario.new 'Ze', '1234'
puts "O funcionario #{f.nome} de matricula #{f.matricula} foi criado" 33
34. Variáveis
definição
irb(main):001:0> a=1
=> 1
irb(main):002:0> a = 1
=> 1
irb(main):003:0> puts a
1
=> nil
irb(main):004:0> a.class
=> Fixnum
irb(main):005:0> a = "Agilidade"
=> "Agilidade"
irb(main):006:0> a.class
=> String
irb(main):007:0> puts a
Agilidade
=> nil
34
35. Variáveis
escopo
x variável local
@x variável de instância
@@x variável de classe
$x variável global
35
37. Booleans
Possíveis valores if a
a = true verdadeiro
a = false falso
a = “qqcoisa” verdadeiro
a = nil falso
a=0 verdadeiro
a=1 verdadeiro
37
38. Strings
“ ” vs ‘ ’
irb(main):001:0> a = "capoeira"
=> "capoeira"
irb(main):002:0> a.class
=> String
irb(main):003:0> a = 'capoeira'
=> "capoeira"
irb(main):004:0> a.class
=> String
irb(main):005:0> a = 'capoeiranbrasil'
=> "capoeiranbrasil"
irb(main):006:0> puts a
capoeiranbrasil
=> nil
irb(main):007:0> a = "capoeiranbrasil"
=> "capoeiranbrasil"
irb(main):008:0> puts a
capoeira
brasil
=> nil
38
39. Strings
expansão de variáveis
irb(main):009:0> b = "o valor de 'a' eh #{a}"
=> "o valor de 'a' eh capoeiranbrasil"
39
40. Strings
múltiplas linhas
irb(main):010:0> a = <<FIM
irb(main):011:0" aqui comeca
irb(main):012:0" um texto
irb(main):013:0" multilinha
irb(main):014:0" que so vai ter fim
irb(main):015:0" quando eu escrever FIM
irb(main):016:0" no inicio da linha
irb(main):017:0" FIM
=> "aqui comecanum textonmultilinhanque so vai ter fim
nquando eu escrever FIMnno inicio da linhan"
irb(main):018:0> puts a
aqui comeca
um texto
multilinha
que so vai ter fim
quando eu escrever FIM
no inicio da linha
=> nil 40
46. Blocos
irb(main):001:0> a = [ "xp", "scrum", "lean" ]
=> ["xp", "scrum", "lean"]
irb(main):002:0> a.each do |metodo|
irb(main):003:1* puts metodo
irb(main):004:1> end
xp
scrum
lean
=> ["xp", "scrum", "lean"]
46
47. Closure
irb(main):014:0> a = %w(huguinho zezinho luizinho)
=> ["huguinho", "zezinho", "luizinho"]
irb(main):015:0> x = 1
=> 1
irb(main):016:0> a.each_with_index do |elemento, indice|
irb(main):017:1* puts "x=#{x} e indice=#{indice}"
irb(main):018:1> x = x + indice
irb(main):019:1> end
x=1 e indice=0
x=1 e indice=1
x=2 e indice=2
=> ["huguinho", "zezinho", "luizinho"]
irb(main):020:0> x
=> 4
47
48. if
puts "Digite um numero: "
STDOUT.flush
a = gets.chomp.to_i
if a == 1
puts "voce digitou 'um'"
elsif a == 2
puts "voce digitou 'dois'"
else
puts "voce digitou um valor desconhecido"
end 48
49. case
puts "Digite um numero: "
STDOUT.flush
a = gets.chomp.to_i
case a
when 1
puts "voce digitou 'um'"
when 2
puts "voce digitou 'dois'"
when 3..9
puts "voce digitou algo entre tres e nove"
else
puts "voce digitou um valor desconhecido"
end 49
50. while
cmd = ""
while ! cmd.eql? "sair"
puts "Digite um comando: "
STDOUT.flush
cmd = gets.chomp
end
puts "Voce saiu." 50
52. labs
1. Imprimir números de 1 a 20
2. Impirimir números ímpares de 1 a 20
3. Imprimir, em ordem invesa, números ímpares de 1 a 20
4. Calcular idade a partir da data de nascimento 52
57. Instalando RubyGems
$ sudo apt-get install rubygems
Lendo lista de pacotes... Pronto
Construindo árvore de dependências
Lendo estado da informação... Pronto
Os pacotes extra a seguir serão instalados:
libgems-ruby1.8 libopenssl-ruby1.8 rdoc1.8
(...)
Descompactando rubygems (de .../rubygems_0.9.4-4_all.deb) ...
Instalando rdoc1.8 (1.8.6.111-2ubuntu1.2) ...
Instalando libopenssl-ruby1.8 (1.8.6.111-2ubuntu1.2) ...
Instalando libgems-ruby1.8 (0.9.4-4) ...
Instalando rubygems (0.9.4-4) ...
$
http://gems.rubyforge.org 57
58. $ sudo gem update --system
Updating RubyGems...
Attempting remote update of rubygems-update
Successfully installed rubygems-update-1.3.1
Updating version of RubyGems to 1.3.1
Installing RubyGems 1.3.1
(...)
RubyGems installed the following executables:
/usr/bin/gem1.8
If `gem` was installed by a previous RubyGems
installation, you may need
to remove it by hand.
RubyGems system software updated
$
Certifique-se de que a
última versão do
RubyGem foi instalada
58
59. $ sudo apt-get install sqlite3
Lendo lista de pacotes... Pronto
Construindo árvore de dependências
Lendo estado da informação... Pronto
(..)
Baixados 19,9kB em 0s (23,6kB/s)
Selecionando pacote previamente não selecionado sqlite3.
(Lendo banco de dados ... 167352 arquivos e diretórios atualmente
instalados.)
Descompactando sqlite3 (de .../sqlite3_3.4.2-2_i386.deb) ...
Instalando sqlite3 (3.4.2-2) ...
Instalando banco de
dados sqlite
59
60. $ sudo apt-get install build-essential ruby1.8-dev libsqlite3-dev
Lendo lista de pacotes... Pronto
Construindo árvore de dependências
Lendo estado da informação... Pronto
(...)
Descompactando build-essential (de .../build-essential_11.3ubuntu1_i386.deb) ...
Selecionando pacote previamente não selecionado libsqlite3-dev.
Descompactando libsqlite3-dev (de .../libsqlite3-dev_3.4.2-2_i386.deb) ...
Selecionando pacote previamente não selecionado ruby1.8-dev.
Descompactando ruby1.8-dev (de .../ruby1.8-dev_1.8.6.111-2ubuntu1.2_i386.deb) ...
Instalando build-essential (11.3ubuntu1) ...
Instalando libsqlite3-dev (3.4.2-2) ...
Instalando ruby1.8-dev (1.8.6.111-2ubuntu1.2) ...
Instalando dependências
necessárias para o acesso
ao banco via Ruby
60
61. $ sudo gem install sqlite3-ruby
Building native extensions. This could take a while...
Successfully installed sqlite3-ruby-1.2.4
1 gem installed
Installing ri documentation for sqlite3-ruby-1.2.4...
Installing RDoc documentation for sqlite3-ruby-1.2.4...
Biblioteca do Ruby
para acesso ao banco
de dados sqlite
61
62. $ sudo gem install rails --version=2.2.2
Successfully installed activesupport-2.2.2
Successfully installed activerecord-2.2.2
Successfully installed actionpack-2.2.2
Successfully installed actionmailer-2.2.2
Successfully installed activeresource-2.2.2
Successfully installed rails-2.2.2
6 gems installed
Installing ri documentation for activesupport-2.2.2...
Installing ri documentation for activerecord-2.2.2...
Installing ri documentation for actionpack-2.2.2...
Installing ri documentation for actionmailer-2.2.2...
Installing ri documentation for activeresource-2.2.2...
Updating ri class cache with 2176 classes...
Installing RDoc documentation for activesupport-2.2.2...
Installing RDoc documentation for activerecord-2.2.2...
Installing RDoc documentation for actionpack-2.2.2...
Installing RDoc documentation for actionmailer-2.2.2...
wInstalling RDoc documentation for activeresource-2.2.2...
Instalando Rails
62
63. Caso o diretório de binários do
RubyGem não tiver sido acrescentado
ao PATH durante a instalação, faça-o
manualmente.
$ rails -v
O programa 'rails' não está instalado atualmente. Você pode instalá-
lo digitando:
sudo apt-get install rails
-bash: rails: comando não encontrado
$
$
$ echo "export PATH=/var/lib/gems/1.8/bin:$PATH" >> ~/.bash_profile
$ . ~/.bash_profile
$
$ rails -v
Rails 2.2.2
Verificando instalação
do Rails
63
65. inscricao_evento $ script/server
=> Booting WEBrick...
=> Rails 2.2.2 application started on http://0.0.0.0:3000
=> Ctrl-C to shutdown server; call with --help for options
[2009-03-22 15:46:11] INFO WEBrick 1.3.1
[2009-03-22 15:46:11] INFO ruby 1.8.7 (2008-08-11) [powerpc-darwin8]
[2009-03-22 15:46:11] INFO WEBrick::HTTPServer#start: pid=2655 port=3000
Para testar a app,
inicialize o servidor do
Rails e acesse pelo
browser...
65
73. Scaffold
Scaffolding is a meta-programming method of building
database-backed software applications. It is a technique
supported by some model-view-controller frameworks, in which
the programmer may write a specification that
describes how the application database may be used.The
compiler uses this specification to generate code that the
application can use to create, read, update and delete
database entries, effectively treating the template as a
"scaffold" on which to build a more powerful application.
http://en.wikipedia.org/wiki/Scaffold_(programming) 73
87. Routes
config/routes.rb
Verbo HTTP URL Controller Action Descrição
GET /participantes Participantes index Lista todos os participantes
Apresenta formulario para
GET /participantes/new Participantes new
novo cadastro
POST /participantes Participantes create Cria um novo participante
Apresenta um participante
GET /participantes/1 Participantes show
específico
Apresenta formulário para edição
GET /participantes/1/edit Participantes edit dos dados de um participante
Atualiza os dados de um
PUT /participantes/1 Participantes update
participante
Apaga o registro de um
DELETE /participantes/1 Participantes destroy
participante
87
106. JRuby
“ JRuby is an 100% pure-Java implementation of
the Ruby programming language.
http://jruby.codehaus.org 106
107. JRuby
“ O JRuby é a implementação 100% em puro
Java da linguagem de programação Ruby. Ou
seja, permite que você rode seus scripts Ruby
na máquina virtual Java
http://ruby-br.org/?p=179 107
108. Forma mais fácil
de instalação
$ sudo apt-get install jruby
Lendo lista de pacotes... Pronto
Construindo árvore de dependências
Lendo estado da informação... Pronto
(...)
Baixados 3483kB em 10s (334kB/s)
Selecionando pacote previamente não selecionado jruby1.0.
(Lendo banco de dados ... 167406 arquivos e diretórios
atualmente instalados.)
Descompactando jruby1.0 (de .../jruby1.0_1.0.2-2_all.deb) ...
Instalando jruby1.0 (1.0.2-2) ...
$ jruby1.0 -v
ruby 1.8.5 (2008-01-07 rev 4810) [i386-jruby1.0.2]
Instalação e teste do
JRuby
http://wiki.jruby.org/wiki/Getting_Started#QuickStart_with_JRuby 108
109. $ apt-cache search jruby
jruby0.9 - 100% pure-Java implementation of Ruby
jruby1.0 - 100% pure-Java implementation of Ruby
A última versão dos
repositórios do
Ubuntu é jruby1.0
(obsoleta)
109
111. $ jruby -S gem list
*** LOCAL GEMS ***
rake (0.8.3)
rspec (1.1.11)
sources (0.0.1)
Teoricamente, tudo o
que podia ser executado
com ruby padrão
(MRI)pode ser executado
também com o jruby...
111
112. ...inclusive, uma
app Rails!
inscricao_evento$ jruby script/server
=> Booting WEBrick
=> Rails 2.3.2 application starting on http://0.0.0.0:3000
JRuby limited openssl loaded. gem install jruby-openssl for full
support.
http://wiki.jruby.org/wiki/JRuby_Builtin_OpenSSL
/opt/jruby-1.1.6/lib/ruby/gems/1.8/gems/actionpack-2.3.2/lib/
action_controller/middleware_stack.rb:84 warning: given block not used
=> Call with -d to detach
=> Ctrl-C to shutdown server
[2009-03-19 10:19:21] INFO WEBrick 1.3.1
[2009-03-19 10:19:21] INFO ruby 1.8.6 (2008-12-17) [java]
[2009-03-19 10:19:21] INFO WEBrick::HTTPServer#start: pid=8699
port=3000
112
114. jruby não encontrou a
gem ‘sqlite3’ do banco
[2009-03-21 07:18:36] INFO WEBrick 1.3.1
[2009-03-21 07:18:36] INFO ruby 1.8.6 (2009-03-13) [java]
[2009-03-21 07:18:36] INFO WEBrick::HTTPServer#start: pid=1010 port=3000
/! FAILSAFE /! Sat Mar 21 07:21:05 -0300 2009
Status: 500 Internal Server Error
no such file to load -- sqlite3
114
115. $ jruby -S gem list
*** LOCAL GEMS ***
actionmailer (2.3.2, 2.2.2)
actionpack (2.3.2, 2.2.2)
activerecord (2.3.2, 2.2.2)
activerecord-jdbc-adapter (0.9.1)
activerecord-jdbcsqlite3-adapter (0.9.1)
activeresource (2.3.2, 2.2.2)
activesupport (2.3.2, 2.2.2)
jdbc-sqlite3 (3.6.3.054)
rails (2.3.2, 2.2.2)
rake (0.8.3)
rspec (1.1.11)
sources (0.0.1)
Realmente, a gem do
sqlite não é listada
115
117. $ jruby -S gem list $ gem list $ sudo gem list $ sudo jruby -S gem list
*** LOCAL GEMS *** *** LOCAL GEMS *** *** LOCAL GEMS *** *** LOCAL GEMS ***
actionmailer (2.3.2) actionmailer (2.2.2) actionmailer (2.2.2) actionmailer (2.3.2)
actionpack (2.3.2) actionpack (2.2.2) actionpack (2.2.2) actionpack (2.3.2)
activerecord (2.3.2) activerecord (2.2.2) activerecord (2.2.2) activerecord (2.3.2)
activeresource (2.3.2) activeresource (2.2.2) activeresource (2.2.2) activeresource (2.3.2)
activesupport (2.3.2) activesupport (2.2.2) activesupport (2.2.2) activesupport (2.3.2)
rails (2.3.2) couchrest (0.12.4) couchrest (0.12.4) rails (2.3.2)
rake (0.8.3) extlib (0.9.10) extlib (0.9.10) rake (0.8.3)
rspec (1.1.11) json (1.1.3) json (1.1.3) rspec (1.1.11)
sources (0.0.1) mime-types (1.16) mime-types (1.16) sources (0.0.1)
mysql (2.7) mysql (2.7)
rails (2.2.2) rails (2.2.2)
rake (0.8.3) rake (0.8.3)
rest-client (0.9) rest-client (0.9)
rspec (1.2.0) rspec (1.2.0)
rubygems-update (1.3.1) rubygems-update (1.3.1)
sqlite3-ruby (1.2.4) sqlite3-ruby (1.2.4)
No Mac, as gems do
jruby são diferentes
das gems do ruby 117
118. $ jruby -S gem list $ gem list $ sudo gem list $ sudo jruby -S gem list
*** LOCAL GEMS *** *** LOCAL GEMS *** *** LOCAL GEMS *** *** LOCAL GEMS ***
actionmailer (2.3.2) actionmailer (2.3.2) actionmailer (2.3.2) actionmailer (2.3.2)
actionpack (2.3.2) actionpack (2.3.2) actionpack (2.3.2) actionpack (2.3.2)
activerecord (2.3.2) activerecord (2.3.2) activerecord (2.3.2) activerecord (2.3.2)
activeresource (2.3.2) activeresource (2.3.2) activeresource (2.3.2) activeresource (2.3.2)
activesupport (2.3.2) activesupport (2.3.2) activesupport (2.3.2) activesupport (2.3.2)
rails (2.3.2) rails (2.3.2) rails (2.3.2) rails (2.3.2)
rake (0.8.3) rake (0.8.3) rake (0.8.4) rake (0.8.3)
rspec (1.1.11) rspec (1.1.11) sqlite3-ruby (1.2.4) rspec (1.1.11)
sources (0.0.1) sources (0.0.1) sources (0.0.1)
No Linux, apenas o
‘sudo’ do ruby varia as
gems
118
119. Caso o ambiente jruby não
esteja com todos os pacotes
instalados, instale-os
$ jruby gem install sqlite3-ruby
119
120. Tentar instalar o
sqlite3 no jruby pode
dar problemas
$ jruby gem install sqlite3-ruby
JRuby limited openssl loaded. gem install jruby-openssl for full
support.
http://wiki.jruby.org/wiki/JRuby_Builtin_OpenSSL
Building native extensions. This could take a while...
/opt/jruby-1.1.6/lib/ruby/1.8/mkmf.rb:7: JRuby does not support
native extensions. Check wiki.jruby.org for alternatives.
(NotImplementedError)
from /opt/jruby-1.1.6/lib/ruby/1.8/mkmf.rb:1:in `require'
from extconf.rb:1
ERROR: Error installing sqlite3-ruby:
ERROR: Failed to build gem native extension.
/opt/jruby-1.1.6/bin/jruby extconf.rb install sqlite3-ruby
120
121. Adaptador Java para o
SQlite
$ gem install activerecord-jdbcsqlite3-adapter
JRuby limited openssl loaded. gem install jruby-openssl for full support.
http://wiki.jruby.org/wiki/JRuby_Builtin_OpenSSL
Successfully installed activerecord-jdbc-adapter-0.9.1
Successfully installed jdbc-sqlite3-3.6.3.054
Successfully installed activerecord-jdbcsqlite3-adapter-0.9.1
3 gems installed
Installing ri documentation for activerecord-jdbc-adapter-0.9.1...
Installing ri documentation for jdbc-sqlite3-3.6.3.054...
Installing ri documentation for activerecord-jdbcsqlite3-adapter-0.9.1...
Installing RDoc documentation for activerecord-jdbc-adapter-0.9.1...
Installing RDoc documentation for jdbc-sqlite3-3.6.3.054...
Installing RDoc documentation for activerecord-jdbcsqlite3-adapter-0.9.1...
121
129. GlassfishOnRails
“ GlassFish v2 and v3 support JRuby on Rails.
The JRuby Wiki captures the latest info on
JRuby on Rails support on GlassFish.
https://glassfish-scripting.dev.java.net/discover/ 129
149. JBossOnRails
“ Thesis: Rails can run well on JBoss
Ruby-on-Rails can run well on JBoss AS. Through
the magic of the JRuby team and Nick Sieger's
JRuby-Rack, running a vanilla Rails app in a servlet
container works.
http://oddthesis.org/theses/jboss-rails 149
154. Instead of building a Ruby
Application Platform from the
ground-up, TorqueBox
leverages the existing ninja-
grade functionality JBoss has
been shipping for years in the
JBoss Application Server.
154
Se for pra resumir o objetivo da palestra em uma frase, seria:
- Quebra de paradigmas. Ideal para curiosos, entusiastas e c&#xE9;ticosdomundojava.
Ruby &#xE9; orientada a objetos.
Uma aplica&#xE7;&#xE3;o OO pode ser vista como um grafo de objetos. Cada aresta do grafo representa a depend&#xEA;ncia de um objeto com outro, sobre a qual mensagens podem ser trocadas.
Os principais conceitos da OOP (e n&#xE3;o os pilares) s&#xE3;o Classe e Objeto.
Classes representam categorias de Objetos.
Objetos representam abstra&#xE7;&#xF5;es do mundo real.
Objetos comunicam entre si atrav&#xE9;s da troca de mensagens.
Classes definem atributos e m&#xE9;todos para seus objetos.
Atributos s&#xE3;o caracter&#xED;sticas que distinguem objetos entre si.
M&#xE9;todos representam o comportamento esperado de um objeto.
Qualquer entidade utilizada na linguagem Ruby pertence a alguma classe.
1 &#xE9; inst&#xE2;ncia da classe Fixnum.
O pr&#xF3;prio resultado de &#x201C;1.methods&#x201D; &#xE9; um objeto da classe Array que, por sua vez, tamb&#xE9;m possui seus pr&#xF3;prios m&#xE9;todos...
...como, por exemplo, o m&#xE9;todo &#x2018;sort&#x2019;, que ordena o Array.
Destaque para o m&#xE9;todo &#x2018;superclass&#x2019; da classe Fixnum.
M&#xE9;todos de classe devem ser invocados pela classe e n&#xE3;o por seus objetos:
Integer.superclass OK
1.class.superclass OK
1.superclass FAIL
De onde apareceram esses &#x2018;comandos&#x2019; class e methods que temos usado?
Toda classe do Ruby extende da classe Object
Logo, os m&#xE9;todos dispon&#xED;veis na classe Object est&#xE3;o tamb&#xE9;m dispon&#xED;veis em qualquer classe Ruby.
Para r&#xE1;pido acesso &#xE0;s principais classes do Ruby, e seus respectivos m&#xE9;todos, consulte o site ruby-doc.org
Nomes de m&#xE9;todos come&#xE7;am com letra min&#xFA;scula
Nomes compostos s&#xE3;o separados por _ (e.g. soma_inteiro e n&#xE3;o somaInteiro)
Par&#xEA;nteses s&#xE3;o opcionais. Logo, &#x2018;def soma a, b&#x2019; e &#x2018;def soma (a, b)&#x2019; s&#xE3;o equivalentes
; tamb&#xE9;m s&#xE3;o opcionais ao final de linha
O retorno do m&#xE9;doto &#xE9; igual a sua &#xFA;ltima opera&#xE7;&#xE3;o
O padr&#xE3;o do Ruby &#xE9; que classes tenham nomes iniciados por letras mai&#xFA;sculas e estejam em um arquivo com o mesmo nome, iniciado por letra min&#xFA;scula.
Toda classe pode ser instanciada pelo m&#xE9;todo new
O m&#xE9;todo new invoca o m&#xE9;todo construtor da classe, se definido.
@valor define uma vari&#xE1;vel de inst&#xE2;ncia, conforme veremos a seguir.
Vari&#xE1;veis n&#xE3;o precisam ser previamente declaradas e/ou inicializadas.
Apesar de a vari&#xE1;vel de inst&#xE2;ncia @valor existir, ela n&#xE3;o &#xE9; acess&#xED;vel externamente.
attr_accessor cria m&#xE9;todos de acesso (&#x2018;gets&#x2019; e &#x2018;sets&#x2019;) para a vari&#xE1;vel de inst&#xE2;ncia
O m&#xE9;todo super invoca o construtor da classe pai.
Pelo padr&#xE3;o do Ruby, nomes de vari&#xE1;veis devem iniciar com letra min&#xFA;scula
Vari&#xE1;veis em Ruby n&#xE3;o s&#xE3;o tipadas
Vari&#xE1;veis n&#xE3;o precisam ser inicializadas
Por n&#xE3;o serem tipadas, vari&#xE1;veis Ruby podem alterar suas refer&#xEA;ncias para outros tipos de objeto em tempo de execu&#xE7;&#xE3;o.
Local - s&#xF3; &#xE9; vis&#xED;vel no escopo em que foi definida (e.g. m&#xE9;todo, loop, if...)
Inst&#xE2;ncia - &#xE9; vis&#xED;vel no escopo do objeto em que foi definida (e.g. &#x201C;alexandre&#x201D;.length)
Classe - &#xE9; vis&#xED;vel no escopo da classe em que foi definida (e.g. String.ancestors)
Global - vis&#xED;vel em todos os escopos
Existem 3 classes que representam n&#xFA;meros no Ruby: Fixnum, Float e Bignum
Qualquer coisa diferente de nil e false &#xE9; verdadeira.
Strings podem ser declaradas com &#x201C; ou &#x2018;
Com &#x201C;, caracteres especiais s&#xE3;o resolvidos
A expans&#xE3;o de vari&#xE1;veis evita a necessidade de concatena&#xE7;&#xE3;o de strings
String com v&#xE1;rias linhas
%Q{ } e %q{ } tamb&#xE9;m podem ser usados para defini&#xE7;&#xE3;o de strings multilinhas, respectivamente, com e sem expans&#xE3;o de vari&#xE1;veis
Constantes devem ter todas as letras mai&#xFA;sculas.
O Ruby n&#xE3;o proibe que se altere o valor de constantes, mas alerta pois, se &#xE9; constante, &#xE9; constante.
Arrays s&#xE3;o automaticamente criados com o uso de colchetes.
Verifique quais s&#xE3;o os m&#xE9;todos de um Array (a.methods)
Arrays tamb&#xE9;m podem ser criados atrav&#xE9;s do m&#xE9;todo construtor new da classe Array
A defini&#xE7;&#xE3;o das c&#xE9;lulas do Array pode se dar em qualquer ordem
[] &#xE9; um m&#xE9;todo da classe Array!
a[0] -> envio da mensagem [] ao objeto a
Hashes s&#xE3;o cole&#xE7;&#xF5;es de chaves que referenciam valores
Em ruby, usa-se o s&#xED;mbolo de chaves ({}) para a cria&#xE7;&#xE3;o de Hashes
Chaves e valores n&#xE3;o precisam seguir qualquer padr&#xE3;o de tipagem
Conceito chave do Ruby (e tamb&#xE9;m do Rails)
S&#xE3;o delimitados por &#x2018;do ... end&#x2019; ou &#x2018;{ ... }&#x2018;
Entendam blocos como trechos de c&#xF3;digo passados por par&#xE2;metro pra algum m&#xE9;todo
&#x2018;each&#x2019; &#xE9; um m&#xE9;todo da classe Array que recebe um bloco de c&#xF3;digo como par&#xE2;metro
Na implementa&#xE7;&#xE3;o do m&#xE9;todo each, cada elemento do Array &#xE9; repassado como par&#xE2;metro para o bloco de c&#xF3;digo informado, que &#xE9; executado a cada ocorr&#xEA;ncia.
O bloco de c&#xF3;digo passado para o m&#xE9;todo each_with_index do objeto Array faz refer&#xEA;ncia a uma vari&#xE1;vel externa ao bloco.
Diz-se que o bloco mant&#xE9;m refer&#xEA;ncia ao seu contexto de origem.
O m&#xE9;todos gets l&#xEA; uma string da entrada padr&#xE3;o
O m&#xE9;todo chomp da classe String remove o
de seu final
O m&#xE9;todo to_i da classe String converte a string em um inteiro
Repare a nota&#xE7;&#xE3;o de intervalos no terceiro when
Imprimir n&#xFA;meros de 1 a 20
Impirimir n&#xFA;meros &#xED;mpares de 1 a 20
Imprimir, em ordem invesa, n&#xFA;meros &#xED;mpares de 1 a 20
Calcular idade a partir da data de nascimento
A diferen&#xE7;a entre usar Java e seus frameworks vs Ruby on Rails -
http://patrickespake.wordpress.com/2009/01/29/a-diferenca-entre-usar-java-e-seus-frameworks-vs-ruby-on-rails/
RubyGems &#xE9; uma esp&#xE9;cie de apt-get do Ruby.
SQLite &#xE9; o banco de dados padr&#xE3;o do Rails, mas &#xE9; poss&#xED;vel usar outros, como PostgreSQL, MySQL etc.
Vamos usar a vers&#xE3;o 2.2.2 devido &#xE0; incompatibilidade do JBoss com a &#xFA;ltima vers&#xE3;o, 2.3.2.
No Ubuntu, os bin&#xE1;rios instalados pelo RubyGems s&#xE3;o armazenados em /var/lib/gems/1.8/bin
O Rails implementa o padr&#xE3;o arquitetural MVC, comum em quase todas aplica&#xE7;&#xF5;es Web.
Pelo padr&#xE3;o, o aplicativo &#xE9; dividido em 3 grandes camadas
Cada camada do padr&#xE3;o MVC responde por um conjunto de responsabilidades
Model: manuten&#xE7;&#xE3;o dos dados; regras de neg&#xF3;cio; &#xE9; independente da forma em que os dados s&#xE3;o apresentados e da forma em que se d&#xE1; a entrada de instru&#xE7;&#xF5;es.
View: apresenta informa&#xE7;&#xF5;es ao usu&#xE1;rio; obt&#xE9;m os dados do Model.
Controller: recebe as a&#xE7;&#xF5;es do usu&#xE1;rio comandadas pela View, geralmente na forma de eventos; Traduz os eventos em solicita&#xE7;&#xF5;es de servi&#xE7;os para o Model ou para a View
Lembre-se disso.
Scaffold &#xE9; um cadastro b&#xE1;sico sobre o qual aplica&#xE7;&#xF5;es complexas s&#xE3;o constru&#xED;das
Na verdade, Scaffold &#xE9; uma t&#xE9;cnica de meta-programa&#xE7;&#xE3;o.
Talvez seja preciso atualizar o RubyGems.
Ser&#xE1; gerada toda infra-estrutura de um CRUD, com Model, Controller, View etc.
Veremos detalhes dessa estrutura mais adiante.
Tamb&#xE9;m falaremos disso mais adiante.
Mas vamos ver o que realmente se passa nesse c&#xF3;digo gerado.
Toda classe Model do Rails extende ActiveRecord::Base
Parte do modelo de entidades do projeto
Cont&#xE9;m regras de neg&#xF3;cio e valida&#xE7;&#xF5;es
Recebe dados das Views, coordena a execu&#xE7;&#xE3;o do Model e devolve o resultado a alguma outra View
Um Controller pode conter v&#xE1;rios m&#xE9;todos (Actions)
O mais comum &#xE9; o Controller buscar dados no Model.
Para exemplifica&#xE7;&#xE3;o das Views, vamos fazer mais uma altera&#xE7;&#xE3;o no Controller.
Por padr&#xE3;o, todo m&#xE9;todo do Controller (action) direciona o fluxo de execu&#xE7;&#xE3;o para uma View de mesmo nome (e.g. index.html.erb)
A View chamada far&#xE1; uso da vari&#xE1;vel de inst&#xE2;ncia @agora retornada pela action index do Controller
ERB ~ JSP ~ ASP ~ PHP
O valor @agora &#xE9; colocado no contexto pelo Controller do slide anterior.
O nome da View est&#xE1; relacionado com o nome da Action que a invoca
Helpers ajudam as Views a serem mais limpas, favorecendo o princ&#xED;pio DRY - don&#x2019;t repeat yourself.
Cada Controller tem um Helper associado.
O nome do Helper est&#xE1; associado ao nome de seu respectivo Controller
Define qual Controller responder&#xE1; por qual requisi&#xE7;&#xE3;o
Existem v&#xE1;rias formas de se definir routes, mas o mais indicado &#xE9; atrav&#xE9;s da estrat&#xE9;gia REST
map.resources cria rotas padr&#xE3;o baseadas em REST para o controlador informado
A simples instru&#xE7;&#xE3;o map.resources :participantes cria 7 rotas.
O Rails implementa o padr&#xE3;o arquitetural MVC, comum em quase todas aplica&#xE7;&#xF5;es Web.
Como o make do Unix.
Como o ant do Java.
Automatiza a execu&#xE7;&#xE3;o de tarefas repetitivas.
Testes s&#xE3;o premissa b&#xE1;sica do Rails, presente em suas ra&#xED;zes mais profundas.
Existem 3 tipos de testes
Unit&#xE1;rios
Funcionais
Integra&#xE7;&#xE3;o
Fixtures: pr&#xE9;-condi&#xE7;&#xF5;es para execu&#xE7;&#xE3;o de uma suite de teste (e.g. dados no banco)
Suites: conjunto de testes executados sob as mesmas Fixtures
Assertions: resultados esperados de cada teste da Suite
Migrations t&#xEA;m a ver com evolu&#xE7;&#xE3;o de bancos de dados
A cada nova release do software, cria-se c&#xF3;digo para evoluir o banco para esta nova release e tamb&#xE9;m para retroceder o banco para a release anterior, caso necess&#xE1;rio.
Numa aplica&#xE7;&#xE3;o Rails existem v&#xE1;rias Migrations como esta.
Cada Migration ajusta o banco conforme evolu&#xE7;&#xE3;o da app (self.up) e possibilita seu retorno ao estado original caso algo d&#xEA; errado na mudan&#xE7;a (seld.down).
Na Migration acima, a tabela &#x2018;participantes&#x2019; &#xE9; criada com duas colunas do tipo string (text, varchar, etc): email e nome,
O comando rake db:migrate executa todas as Migrations no banco.
Criar aplica&#xE7;&#xE3;o Rails
Explorar os arquivos gerados
Criar Scaffold para alguma entidade
Criar testes unit&#xE1;rios
Criar testes funcionais
A forma mais f&#xE1;cil de instala&#xE7;&#xE3;o do JRuby &#xE9; atrav&#xE9;s de algum gerenciador de pacotes (apt-get, yum, macports...), mas deve-se tomar cuidado com a obsolesc&#xEA;ncia das vers&#xF5;es dispon&#xED;veis.