SlideShare uma empresa Scribd logo
Ecossistema Ruby
O que Ruby está trazendo ao mundo de
desenvolvimento de software.
@rafaeldx7
@rafaeldx7
Rafael Almeida de Carvalho
Ruby
É uma linguagem de programação.
Interpretada
Multiparadigma
Tipagem Dinâmica
Tipagem Forte
Código Aberto
Criada porYukihiro "Matz" Matsumoto
“I wanted a scripting language that was more
powerful than Perl, and more object-oriented
than Python.”
http://linuxdevcenter.com/pub/a/linux/2001/11/29/ruby.html
Início do desenvolvimentoDez/1993
Dez/1994 Primeira versão alpha
Dez/1995 Release 0.95
Dez/1996 Versão 1.0
Ago/2010 Versão 1.9.2
Interpretadores
MRI
Matz Ruby Interpreter
for .NET 4.0, Silverlight 4 and Windows Phone 7.
blá blá blá...
CADÊ O CÓDIGO!?
Imprimir os números
ímpares entre
1 e limit.
def impares(limit)
1.upto(limit).select { |n| n.odd? }
end
Tipagem Dinâmica
nome = "Rafael"
# => "Rafael"
nome.class
# => String
nome = :rafael
# => :rafael
nome.class
# => Symbol
Tipagem Forte!
ruby $> 1 + "1"
TypeError: String can't be coerced
into Fixnum
! from (irb):21:in `+'
! from (irb):21
ruby $> 1 + "1"
TUDO é um objeto!
3.times { puts "Hi!" }
# Hi!
# Hi!
# Hi!
"Ruby eh show!".split.reverse
"Ruby eh show!".split.reverse
=> ["show!", "eh", "Ruby"]
true.class
=> TrueClass
true.methods.count
=> 48
true.to_s
=> “true”
nil.class
=> NilClass
0.10.class
=> Float
Métodos são
objetos!
42.next
# => 43
method = 42.method :next
# => #<Method: Fixnum(Integer)#next>
method.call
# => 43
method.class
# => Method
Operadores são
Métodos
2 + 2
# => 4
2.+(2)
# => 4
2.public_methods.sort
# => ["!", "!=", "!~", "%", "&", "*",
"**", "+", "+@", "-", "-@", "/", "<",
"<<","<=", "<=>", "==", "===", "=~",
">", ">=", ">>", "[]", "^", ... ]
class Fixnum
def +(value)
"#{self} + #{value}"
end
def ==(value)
self * value
end
end
puts 4 + 4
# => "4 + 4"
puts 3 == 2
# => 6
Executar um método é
enviar uma mensagem
ao objeto.
2 + 2
#=> 4
2.send('+', 2)
=> 4
['rafael', 'dx7'].join
=> "rafaeldx7"
['rafael', 'dx7'].send(:join)
=> "rafaeldx7"
Métodos
SEMPRE retornam valor!
def um_metodo
end
um_metodo
# nil
def um_metodo
1 == 2 - 1
end
um_metodo
# true
def um_metodo
"Opa!"
end
um_metodo
# "Opa!"
def um_metodo
(1..5).to_a
end
um_metodo
#[1,2,3,4,5]
def um_metodo
return 1, 2, 3
end
a, b, c = um_metodo
puts a, b, c
=> #1
=> #2
=> #3
Metaprogramação
class Foo
end
Foo.class_eval do
define_method("novo") do |arg|
puts arg
end
end
f = Foo.new
f.novo("123")
=> # 123
class Foo
def method_missing(name)
puts "método #{name} desconhecido"
end
end
f = Foo.new
f.xpto
=> método xpto desconhecido
Mais JRuby
fizzbuzz
def fizzbuzz(number)
resp = ""
resp.tap do
resp << "fizz" if number.modulo(3) == 0
resp << "buzz" if number.modulo(5) == 0
resp << number.to_s if resp.empty?
end
end
def fizzbuzz(number)
resp = ""
resp.tap do
resp << "fizz" if number.modulo(3) == 0
resp << "buzz" if number.modulo(5) == 0
resp << number.to_s if resp.empty?
end
end
pane = javax.swing.JOptionPane
numbers = pane.show_input_dialog("Quantos
números?").to_i
def fizzbuzz(number)
resp = ""
resp.tap do
resp << "fizz" if number.modulo(3) == 0
resp << "buzz" if number.modulo(5) == 0
resp << number.to_s if resp.empty?
end
end
pane = javax.swing.JOptionPane
list = java.util.ArrayList.new
numbers = pane.show_input_dialog("Quantos
números?").to_i
numbers.times do |i|
list << fizzbuzz(i + 1)
end
def fizzbuzz(number)
resp = ""
resp.tap do
resp << "fizz" if number.modulo(3) == 0
resp << "buzz" if number.modulo(5) == 0
resp << number.to_s if resp.empty?
end
end
pane = javax.swing.JOptionPane
list = java.util.ArrayList.new
numbers = pane.show_input_dialog("Quantos
números?").to_i
numbers.times do |i|
list << fizzbuzz(i + 1)
end
pane.show_message_dialog(nil, list.to_s)
require 'java'
def fizzbuzz(number)
resp = ""
resp.tap do
resp << "fizz" if number.modulo(3) == 0
resp << "buzz" if number.modulo(5) == 0
resp << number.to_s if resp.empty?
end
end
pane = javax.swing.JOptionPane
list = java.util.ArrayList.new
numbers = pane.show_input_dialog("Quantos
números?").to_i
numbers.times do |i|
list << fizzbuzz(i + 1)
end
pane.show_message_dialog(nil, list.to_s)
$ ruby fizzbuzz.rb
$ ruby fizzbuzz.rb
$ ruby fizzbuzz.rb
DSL
Domain Specific Language
describe Account do
context "transfering money" do
it "deposits transfer amount to the other account" do
source = Account.new(50, :USD)
target = mock('target account')
target.should_receive(:deposit).with(Money.new(5, :USD))
source.transfer(5, :USD).to(target)
end
it "reduces its balance by the transfer amount" do
source = Account.new(50, :USD)
target = stub('target account')
source.transfer(5, :USD).to(target)
source.balance.should == Money.new(45, :USD)
end
end
end
RSpec - Testando código Ruby
# language: pt
Funcionalidade: Usuário gerenciando produtos
Como um usuário com permissão de gerenciar produtos
Com o objetivo de dividir responsabilidades
E custos por produto
Eu deveria poder cadastrar
E gerenciar uma lista de produtos
Cenário: Listar produtos
Dado que eu esteja logado
E que existem os produtos produto 1, produto 2
E que eu esteja na página inicial
Quando eu clico "Produtos"
Então eu devo ver "produto 1"
E eu devo ver "produto 2"
Cucumber - Testes de Aceitação
RubyGems
$ gem install ruby-bitly
Successfully installed mime-types-1.16
Successfully installed rest-client-1.6.0
Successfully installed json_pure-1.4.3
Successfully installed ruby-bitly-0.1.3
4 gems installed
$ gem list
*** LOCAL GEMS ***
json_pure (1.4.3)
mime-types (1.16)
rest-client (1.6.0)
ruby-bitly (0.1.3)
Instalando uma gem
$ bitly http://rafaeldx7.github.com
Short url: http://bit.ly/aRr9aH
Usando a gem em linha de comando
require 'rubygems'
require 'ruby-bitly'
bitly = Bitly.shorten 'http://rafaeldx7.github.com',
'rafaeldx7',
'R_xxxxxxxxxxxxxxxxxxxxxxxxxxx'
puts bitly.url
=> "http://bit.ly/aRr9aH"
Usando a gem em um código Ruby
Um framework Web para Ruby
Extraído de uma aplicação real
Criado em julho/2004
É um conjunto de gems
Uma DSL para aplicações web
Instalação do Rails
$ gem install rails
Successfully installed activesupport-3.0.1
Successfully installed builder-2.1.2
Successfully installed i18n-0.4.2
Successfully installed activemodel-3.0.1
Successfully installed rack-1.2.1
Successfully installed rack-test-0.5.6
Successfully installed rack-mount-0.6.13
Successfully installed tzinfo-0.3.23
Successfully installed abstract-1.0.0
Successfully installed erubis-2.6.6
Successfully installed actionpack-3.0.1
Successfully installed arel-1.0.1
Successfully installed activerecord-3.0.1
Successfully installed activeresource-3.0.1
Successfully installed polyglot-0.3.1
Successfully installed treetop-1.4.8
Successfully installed mail-2.2.9
Successfully installed actionmailer-3.0.1
Successfully installed thor-0.14.4
Successfully installed railties-3.0.1
Successfully installed rails-3.0.1
21 gems installed
Criando uma aplicação Rails
$ rails new sc2010
create
create README
create Rakefile
create config.ru
create .gitignore
create Gemfile
create app
create app/controllers/application_controller.rb
create app/helpers/application_helper.rb
create app/mailers
create app/models
.
.
.
$ bundle install
$ rails server
Vamos fazer alguma coisa...
$ rails generate scaffold task name:string done:boolean
invoke active_record
create db/migrate/20101111152244_create_tasks.rb
create app/models/task.rb
invoke test_unit
create test/unit/task_test.rb
create test/fixtures/tasks.yml
route resources :tasks
invoke scaffold_controller
create app/controllers/tasks_controller.rb
invoke erb
create app/views/tasks
create app/views/tasks/index.html.erb
create app/views/tasks/edit.html.erb
create app/views/tasks/show.html.erb
create app/views/tasks/new.html.erb
create app/views/tasks/_form.html.erb
invoke test_unit
create test/functional/tasks_controller_test.rb
invoke helper
create app/helpers/tasks_helper.rb
invoke test_unit
create test/unit/helpers/tasks_helper_test.rb
invoke stylesheets
create public/stylesheets/scaffold.css
Criando o DB e iniciando o servidor
$ rake db:migrate
(in /Users/rafael/Sites/playground/sc2010)
== CreateTasks: migrating ==============================================
-- create_table(:tasks)
-> 0.0026s
== CreateTasks: migrated (0.0034s) =====================================
$ rails server
=> Booting WEBrick
=> Rails 3.0.1 application starting in development on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
[2010-11-11 13:25:52] INFO WEBrick 1.3.1
[2010-11-11 13:25:52] INFO ruby 1.8.7 (2010-08-16) [x86_64-darwin10.4.0]
[2010-11-11 13:25:52] INFO WEBrick::HTTPServer#start: pid=7367 port=3000
Uma tarefa precisa ter um nome
class Task < ActiveRecord::Base
validates_presence_of :name
end
class Task < ActiveRecord::Base
validates_presence_of :name
belongs_to :user
has_many :statuses
end
Quem usa Rails?
Como aprender?
pine.fm/LearnToProgram
aprendaaprogramar.rubyonrails.pro.br
Foi divertido? =D
Perguntas?
Obrigado!
@rafaeldx7

Mais conteúdo relacionado

Mais procurados

Rest fuuuu front-end
Rest fuuuu front-endRest fuuuu front-end
Rest fuuuu front-end
Igor Santos
 
REST-fuuuu - Boas práticas RESTful [PHPeste 2017]
REST-fuuuu - Boas práticas RESTful [PHPeste 2017]REST-fuuuu - Boas práticas RESTful [PHPeste 2017]
REST-fuuuu - Boas práticas RESTful [PHPeste 2017]
Igor Santos
 
Gerenciamento de dependências em python
Gerenciamento de dependências em pythonGerenciamento de dependências em python
Gerenciamento de dependências em python
Patrick Porto
 
Python com r (mini projeto)
Python com r (mini projeto)Python com r (mini projeto)
Python com r (mini projeto)
Danilo Costa
 
15 coisas sobre php para saber antes de morrer
15 coisas sobre php para saber antes de morrer15 coisas sobre php para saber antes de morrer
15 coisas sobre php para saber antes de morrer
Michele Silva
 
Go Lang para desenvolvedores pragmáticos (parte 1)
Go Lang para desenvolvedores pragmáticos (parte 1)Go Lang para desenvolvedores pragmáticos (parte 1)
Go Lang para desenvolvedores pragmáticos (parte 1)
Wilson Júnior
 
Iniciando em Python
Iniciando em PythonIniciando em Python
Iniciando em Python
Rober Guerra
 
Zimbra Anahuac2
Zimbra Anahuac2Zimbra Anahuac2
Zimbra Anahuac2anahuac2
 
Guia com mais de 500 comandos do linux explicados computeiro da depressão
Guia com mais de 500 comandos do linux explicados   computeiro da depressãoGuia com mais de 500 comandos do linux explicados   computeiro da depressão
Guia com mais de 500 comandos do linux explicados computeiro da depressão
Jesser Martins Medeiros
 
Linux shell
Linux shellLinux shell
Linux shell
Frederico Madeira
 
Lista de exercícios em Bash (resolvida)
Lista de exercícios em Bash (resolvida) Lista de exercícios em Bash (resolvida)
Lista de exercícios em Bash (resolvida)
Marcelo Barros de Almeida
 
Técnicas para preparação e desenvolvimento de sites em django
Técnicas para preparação e desenvolvimento de sites em djangoTécnicas para preparação e desenvolvimento de sites em django
Técnicas para preparação e desenvolvimento de sites em django
Mario Chaves
 
Shell Script - Controle de fluxo
Shell Script - Controle de fluxoShell Script - Controle de fluxo
Shell Script - Controle de fluxo
Frederico Madeira
 
Theano - Alto Desempenho em Machine Learning
Theano - Alto Desempenho em Machine LearningTheano - Alto Desempenho em Machine Learning
Theano - Alto Desempenho em Machine Learning
Felipe Martins
 
PHP Experience 2016 - [Palestra] Keynote: PHP-7
PHP Experience 2016 - [Palestra] Keynote: PHP-7PHP Experience 2016 - [Palestra] Keynote: PHP-7
PHP Experience 2016 - [Palestra] Keynote: PHP-7
iMasters
 
Fundamentos de Sockets
Fundamentos de SocketsFundamentos de Sockets
Fundamentos de Sockets
Denis L Presciliano
 

Mais procurados (18)

Rest fuuuu front-end
Rest fuuuu front-endRest fuuuu front-end
Rest fuuuu front-end
 
REST-fuuuu - Boas práticas RESTful [PHPeste 2017]
REST-fuuuu - Boas práticas RESTful [PHPeste 2017]REST-fuuuu - Boas práticas RESTful [PHPeste 2017]
REST-fuuuu - Boas práticas RESTful [PHPeste 2017]
 
Gerenciamento de dependências em python
Gerenciamento de dependências em pythonGerenciamento de dependências em python
Gerenciamento de dependências em python
 
Python com r (mini projeto)
Python com r (mini projeto)Python com r (mini projeto)
Python com r (mini projeto)
 
15 coisas sobre php para saber antes de morrer
15 coisas sobre php para saber antes de morrer15 coisas sobre php para saber antes de morrer
15 coisas sobre php para saber antes de morrer
 
Go Lang para desenvolvedores pragmáticos (parte 1)
Go Lang para desenvolvedores pragmáticos (parte 1)Go Lang para desenvolvedores pragmáticos (parte 1)
Go Lang para desenvolvedores pragmáticos (parte 1)
 
Iniciando em Python
Iniciando em PythonIniciando em Python
Iniciando em Python
 
Zimbra Anahuac2
Zimbra Anahuac2Zimbra Anahuac2
Zimbra Anahuac2
 
Guia com mais de 500 comandos do linux explicados computeiro da depressão
Guia com mais de 500 comandos do linux explicados   computeiro da depressãoGuia com mais de 500 comandos do linux explicados   computeiro da depressão
Guia com mais de 500 comandos do linux explicados computeiro da depressão
 
Linux shell
Linux shellLinux shell
Linux shell
 
Lista de exercícios em Bash (resolvida)
Lista de exercícios em Bash (resolvida) Lista de exercícios em Bash (resolvida)
Lista de exercícios em Bash (resolvida)
 
Técnicas para preparação e desenvolvimento de sites em django
Técnicas para preparação e desenvolvimento de sites em djangoTécnicas para preparação e desenvolvimento de sites em django
Técnicas para preparação e desenvolvimento de sites em django
 
Shell Script - Controle de fluxo
Shell Script - Controle de fluxoShell Script - Controle de fluxo
Shell Script - Controle de fluxo
 
Shell script i
Shell script iShell script i
Shell script i
 
Sapo Sessions PHP
Sapo Sessions PHPSapo Sessions PHP
Sapo Sessions PHP
 
Theano - Alto Desempenho em Machine Learning
Theano - Alto Desempenho em Machine LearningTheano - Alto Desempenho em Machine Learning
Theano - Alto Desempenho em Machine Learning
 
PHP Experience 2016 - [Palestra] Keynote: PHP-7
PHP Experience 2016 - [Palestra] Keynote: PHP-7PHP Experience 2016 - [Palestra] Keynote: PHP-7
PHP Experience 2016 - [Palestra] Keynote: PHP-7
 
Fundamentos de Sockets
Fundamentos de SocketsFundamentos de Sockets
Fundamentos de Sockets
 

Semelhante a Ruby

Crash Course Ruby & Rails
Crash Course Ruby & RailsCrash Course Ruby & Rails
Crash Course Ruby & Rails
Frevo on Rails
 
Palestra Ruby
Palestra RubyPalestra Ruby
Palestra Ruby
Cássio Marques
 
O que mudou no Ruby 1.9
O que mudou no Ruby 1.9O que mudou no Ruby 1.9
O que mudou no Ruby 1.9
Nando Vieira
 
Ruby para programadores PHP
Ruby para programadores PHPRuby para programadores PHP
Ruby para programadores PHPJuan Maiz
 
Ruby para-programadores-php
Ruby para-programadores-phpRuby para-programadores-php
Ruby para-programadores-phpJuan Maiz
 
Minicurso Ruby on Rails
Minicurso Ruby on RailsMinicurso Ruby on Rails
Minicurso Ruby on Rails
Maurício Eduardo
 
TDC2017 | São Paulo - Trilha Programação Funcional How we figured out we had ...
TDC2017 | São Paulo - Trilha Programação Funcional How we figured out we had ...TDC2017 | São Paulo - Trilha Programação Funcional How we figured out we had ...
TDC2017 | São Paulo - Trilha Programação Funcional How we figured out we had ...
tdc-globalcode
 
Robot Operating System - Iniciação a Robótica
Robot Operating System - Iniciação a RobóticaRobot Operating System - Iniciação a Robótica
Robot Operating System - Iniciação a Robótica
Francisco Soares Lima Filho
 
Ruby - Criando código para máquinas e humanos
Ruby - Criando código para máquinas e humanosRuby - Criando código para máquinas e humanos
Ruby - Criando código para máquinas e humanos
Gregorio Kusowski
 
O mundo visto de dentro do Ruby
O mundo visto de dentro do RubyO mundo visto de dentro do Ruby
O mundo visto de dentro do Ruby
Vítor Avelino Dutra Magalhães
 
Possibilidades com python
Possibilidades com pythonPossibilidades com python
Possibilidades com pythonUFPA
 
Quick introduction to Ruby on Rails
Quick introduction to Ruby on RailsQuick introduction to Ruby on Rails
Quick introduction to Ruby on Rails
Whitesmith
 
Ruby and Rails intro
Ruby and Rails introRuby and Rails intro
Ruby and Rails intro
Nuno Silva
 
Criando sua própria linguagem de programação
Criando sua própria linguagem de programaçãoCriando sua própria linguagem de programação
Criando sua própria linguagem de programação
ronaldoferraz
 
TDC2017 | POA Trilha Programacao Funicional - (Nunca) Ouvi falar de Rust... m...
TDC2017 | POA Trilha Programacao Funicional - (Nunca) Ouvi falar de Rust... m...TDC2017 | POA Trilha Programacao Funicional - (Nunca) Ouvi falar de Rust... m...
TDC2017 | POA Trilha Programacao Funicional - (Nunca) Ouvi falar de Rust... m...
tdc-globalcode
 
Linguagem PHP
Linguagem PHPLinguagem PHP
Linguagem PHP
Bruno Cunha
 
Dev Ext PHP
Dev Ext PHPDev Ext PHP
Dev Ext PHP
Andre Golvea
 
Ecossistema Python
Ecossistema PythonEcossistema Python
Ecossistema Python
Henrique Bastos
 
Introducao rubyonrails
Introducao rubyonrailsIntroducao rubyonrails
Introducao rubyonrails
Douglas Camargo
 
Redis um banco chave valor
Redis um banco chave valorRedis um banco chave valor
Redis um banco chave valor
Kinn Julião
 

Semelhante a Ruby (20)

Crash Course Ruby & Rails
Crash Course Ruby & RailsCrash Course Ruby & Rails
Crash Course Ruby & Rails
 
Palestra Ruby
Palestra RubyPalestra Ruby
Palestra Ruby
 
O que mudou no Ruby 1.9
O que mudou no Ruby 1.9O que mudou no Ruby 1.9
O que mudou no Ruby 1.9
 
Ruby para programadores PHP
Ruby para programadores PHPRuby para programadores PHP
Ruby para programadores PHP
 
Ruby para-programadores-php
Ruby para-programadores-phpRuby para-programadores-php
Ruby para-programadores-php
 
Minicurso Ruby on Rails
Minicurso Ruby on RailsMinicurso Ruby on Rails
Minicurso Ruby on Rails
 
TDC2017 | São Paulo - Trilha Programação Funcional How we figured out we had ...
TDC2017 | São Paulo - Trilha Programação Funcional How we figured out we had ...TDC2017 | São Paulo - Trilha Programação Funcional How we figured out we had ...
TDC2017 | São Paulo - Trilha Programação Funcional How we figured out we had ...
 
Robot Operating System - Iniciação a Robótica
Robot Operating System - Iniciação a RobóticaRobot Operating System - Iniciação a Robótica
Robot Operating System - Iniciação a Robótica
 
Ruby - Criando código para máquinas e humanos
Ruby - Criando código para máquinas e humanosRuby - Criando código para máquinas e humanos
Ruby - Criando código para máquinas e humanos
 
O mundo visto de dentro do Ruby
O mundo visto de dentro do RubyO mundo visto de dentro do Ruby
O mundo visto de dentro do Ruby
 
Possibilidades com python
Possibilidades com pythonPossibilidades com python
Possibilidades com python
 
Quick introduction to Ruby on Rails
Quick introduction to Ruby on RailsQuick introduction to Ruby on Rails
Quick introduction to Ruby on Rails
 
Ruby and Rails intro
Ruby and Rails introRuby and Rails intro
Ruby and Rails intro
 
Criando sua própria linguagem de programação
Criando sua própria linguagem de programaçãoCriando sua própria linguagem de programação
Criando sua própria linguagem de programação
 
TDC2017 | POA Trilha Programacao Funicional - (Nunca) Ouvi falar de Rust... m...
TDC2017 | POA Trilha Programacao Funicional - (Nunca) Ouvi falar de Rust... m...TDC2017 | POA Trilha Programacao Funicional - (Nunca) Ouvi falar de Rust... m...
TDC2017 | POA Trilha Programacao Funicional - (Nunca) Ouvi falar de Rust... m...
 
Linguagem PHP
Linguagem PHPLinguagem PHP
Linguagem PHP
 
Dev Ext PHP
Dev Ext PHPDev Ext PHP
Dev Ext PHP
 
Ecossistema Python
Ecossistema PythonEcossistema Python
Ecossistema Python
 
Introducao rubyonrails
Introducao rubyonrailsIntroducao rubyonrails
Introducao rubyonrails
 
Redis um banco chave valor
Redis um banco chave valorRedis um banco chave valor
Redis um banco chave valor
 

Ruby

  • 1. Ecossistema Ruby O que Ruby está trazendo ao mundo de desenvolvimento de software. @rafaeldx7
  • 3. Ruby É uma linguagem de programação.
  • 5. Criada porYukihiro "Matz" Matsumoto “I wanted a scripting language that was more powerful than Perl, and more object-oriented than Python.” http://linuxdevcenter.com/pub/a/linux/2001/11/29/ruby.html
  • 6. Início do desenvolvimentoDez/1993 Dez/1994 Primeira versão alpha Dez/1995 Release 0.95 Dez/1996 Versão 1.0 Ago/2010 Versão 1.9.2
  • 9.
  • 10. for .NET 4.0, Silverlight 4 and Windows Phone 7.
  • 11.
  • 12. blá blá blá... CADÊ O CÓDIGO!?
  • 13. Imprimir os números ímpares entre 1 e limit.
  • 16. nome = "Rafael" # => "Rafael" nome.class # => String nome = :rafael # => :rafael nome.class # => Symbol
  • 18. ruby $> 1 + "1"
  • 19. TypeError: String can't be coerced into Fixnum ! from (irb):21:in `+' ! from (irb):21 ruby $> 1 + "1"
  • 20. TUDO é um objeto!
  • 21. 3.times { puts "Hi!" } # Hi! # Hi! # Hi!
  • 23. "Ruby eh show!".split.reverse => ["show!", "eh", "Ruby"]
  • 27. 42.next # => 43 method = 42.method :next # => #<Method: Fixnum(Integer)#next> method.call # => 43 method.class # => Method
  • 29. 2 + 2 # => 4 2.+(2) # => 4 2.public_methods.sort # => ["!", "!=", "!~", "%", "&", "*", "**", "+", "+@", "-", "-@", "/", "<", "<<","<=", "<=>", "==", "===", "=~", ">", ">=", ">>", "[]", "^", ... ]
  • 30. class Fixnum def +(value) "#{self} + #{value}" end def ==(value) self * value end end puts 4 + 4 # => "4 + 4" puts 3 == 2 # => 6
  • 31. Executar um método é enviar uma mensagem ao objeto.
  • 32. 2 + 2 #=> 4 2.send('+', 2) => 4 ['rafael', 'dx7'].join => "rafaeldx7" ['rafael', 'dx7'].send(:join) => "rafaeldx7"
  • 34. def um_metodo end um_metodo # nil def um_metodo 1 == 2 - 1 end um_metodo # true def um_metodo "Opa!" end um_metodo # "Opa!" def um_metodo (1..5).to_a end um_metodo #[1,2,3,4,5]
  • 35. def um_metodo return 1, 2, 3 end a, b, c = um_metodo puts a, b, c => #1 => #2 => #3
  • 37. class Foo end Foo.class_eval do define_method("novo") do |arg| puts arg end end f = Foo.new f.novo("123") => # 123
  • 38. class Foo def method_missing(name) puts "método #{name} desconhecido" end end f = Foo.new f.xpto => método xpto desconhecido
  • 41. def fizzbuzz(number) resp = "" resp.tap do resp << "fizz" if number.modulo(3) == 0 resp << "buzz" if number.modulo(5) == 0 resp << number.to_s if resp.empty? end end
  • 42. def fizzbuzz(number) resp = "" resp.tap do resp << "fizz" if number.modulo(3) == 0 resp << "buzz" if number.modulo(5) == 0 resp << number.to_s if resp.empty? end end pane = javax.swing.JOptionPane numbers = pane.show_input_dialog("Quantos números?").to_i
  • 43. def fizzbuzz(number) resp = "" resp.tap do resp << "fizz" if number.modulo(3) == 0 resp << "buzz" if number.modulo(5) == 0 resp << number.to_s if resp.empty? end end pane = javax.swing.JOptionPane list = java.util.ArrayList.new numbers = pane.show_input_dialog("Quantos números?").to_i numbers.times do |i| list << fizzbuzz(i + 1) end
  • 44. def fizzbuzz(number) resp = "" resp.tap do resp << "fizz" if number.modulo(3) == 0 resp << "buzz" if number.modulo(5) == 0 resp << number.to_s if resp.empty? end end pane = javax.swing.JOptionPane list = java.util.ArrayList.new numbers = pane.show_input_dialog("Quantos números?").to_i numbers.times do |i| list << fizzbuzz(i + 1) end pane.show_message_dialog(nil, list.to_s)
  • 45. require 'java' def fizzbuzz(number) resp = "" resp.tap do resp << "fizz" if number.modulo(3) == 0 resp << "buzz" if number.modulo(5) == 0 resp << number.to_s if resp.empty? end end pane = javax.swing.JOptionPane list = java.util.ArrayList.new numbers = pane.show_input_dialog("Quantos números?").to_i numbers.times do |i| list << fizzbuzz(i + 1) end pane.show_message_dialog(nil, list.to_s)
  • 50. describe Account do context "transfering money" do it "deposits transfer amount to the other account" do source = Account.new(50, :USD) target = mock('target account') target.should_receive(:deposit).with(Money.new(5, :USD)) source.transfer(5, :USD).to(target) end it "reduces its balance by the transfer amount" do source = Account.new(50, :USD) target = stub('target account') source.transfer(5, :USD).to(target) source.balance.should == Money.new(45, :USD) end end end RSpec - Testando código Ruby
  • 51. # language: pt Funcionalidade: Usuário gerenciando produtos Como um usuário com permissão de gerenciar produtos Com o objetivo de dividir responsabilidades E custos por produto Eu deveria poder cadastrar E gerenciar uma lista de produtos Cenário: Listar produtos Dado que eu esteja logado E que existem os produtos produto 1, produto 2 E que eu esteja na página inicial Quando eu clico "Produtos" Então eu devo ver "produto 1" E eu devo ver "produto 2" Cucumber - Testes de Aceitação
  • 53. $ gem install ruby-bitly Successfully installed mime-types-1.16 Successfully installed rest-client-1.6.0 Successfully installed json_pure-1.4.3 Successfully installed ruby-bitly-0.1.3 4 gems installed $ gem list *** LOCAL GEMS *** json_pure (1.4.3) mime-types (1.16) rest-client (1.6.0) ruby-bitly (0.1.3) Instalando uma gem
  • 54. $ bitly http://rafaeldx7.github.com Short url: http://bit.ly/aRr9aH Usando a gem em linha de comando
  • 55. require 'rubygems' require 'ruby-bitly' bitly = Bitly.shorten 'http://rafaeldx7.github.com', 'rafaeldx7', 'R_xxxxxxxxxxxxxxxxxxxxxxxxxxx' puts bitly.url => "http://bit.ly/aRr9aH" Usando a gem em um código Ruby
  • 56.
  • 57.
  • 58. Um framework Web para Ruby Extraído de uma aplicação real Criado em julho/2004 É um conjunto de gems Uma DSL para aplicações web
  • 59. Instalação do Rails $ gem install rails Successfully installed activesupport-3.0.1 Successfully installed builder-2.1.2 Successfully installed i18n-0.4.2 Successfully installed activemodel-3.0.1 Successfully installed rack-1.2.1 Successfully installed rack-test-0.5.6 Successfully installed rack-mount-0.6.13 Successfully installed tzinfo-0.3.23 Successfully installed abstract-1.0.0 Successfully installed erubis-2.6.6 Successfully installed actionpack-3.0.1 Successfully installed arel-1.0.1 Successfully installed activerecord-3.0.1 Successfully installed activeresource-3.0.1 Successfully installed polyglot-0.3.1 Successfully installed treetop-1.4.8 Successfully installed mail-2.2.9 Successfully installed actionmailer-3.0.1 Successfully installed thor-0.14.4 Successfully installed railties-3.0.1 Successfully installed rails-3.0.1 21 gems installed
  • 60. Criando uma aplicação Rails $ rails new sc2010 create create README create Rakefile create config.ru create .gitignore create Gemfile create app create app/controllers/application_controller.rb create app/helpers/application_helper.rb create app/mailers create app/models . . . $ bundle install
  • 62.
  • 63. Vamos fazer alguma coisa... $ rails generate scaffold task name:string done:boolean invoke active_record create db/migrate/20101111152244_create_tasks.rb create app/models/task.rb invoke test_unit create test/unit/task_test.rb create test/fixtures/tasks.yml route resources :tasks invoke scaffold_controller create app/controllers/tasks_controller.rb invoke erb create app/views/tasks create app/views/tasks/index.html.erb create app/views/tasks/edit.html.erb create app/views/tasks/show.html.erb create app/views/tasks/new.html.erb create app/views/tasks/_form.html.erb invoke test_unit create test/functional/tasks_controller_test.rb invoke helper create app/helpers/tasks_helper.rb invoke test_unit create test/unit/helpers/tasks_helper_test.rb invoke stylesheets create public/stylesheets/scaffold.css
  • 64. Criando o DB e iniciando o servidor $ rake db:migrate (in /Users/rafael/Sites/playground/sc2010) == CreateTasks: migrating ============================================== -- create_table(:tasks) -> 0.0026s == CreateTasks: migrated (0.0034s) ===================================== $ rails server => Booting WEBrick => Rails 3.0.1 application starting in development on http://0.0.0.0:3000 => Call with -d to detach => Ctrl-C to shutdown server [2010-11-11 13:25:52] INFO WEBrick 1.3.1 [2010-11-11 13:25:52] INFO ruby 1.8.7 (2010-08-16) [x86_64-darwin10.4.0] [2010-11-11 13:25:52] INFO WEBrick::HTTPServer#start: pid=7367 port=3000
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71. Uma tarefa precisa ter um nome class Task < ActiveRecord::Base validates_presence_of :name end
  • 72.
  • 73. class Task < ActiveRecord::Base validates_presence_of :name belongs_to :user has_many :statuses end
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 90.
  • 91.
  • 92.
  • 95.
  • 96.
  • 97.
  • 98.