ruby
DESCRIPTION
O que Ruby está trazendo ao mundo de desenvolvimento de software.TRANSCRIPT
Ecossistema Ruby
O que Ruby está trazendo ao mundo de desenvolvimento de software.
@rafaeldx7
@rafaeldx7Rafael Almeida de Carvalho
RubyÉ uma linguagem de programação.
Interpretada
Multiparadigma
Tipagem Dinâmica
Tipagem Forte
Código Aberto
Criada por Yukihiro "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
MRIMatz 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 endend
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étodosSEMPRE retornam valor!
def um_metodoend
um_metodo# nil
def um_metodo1 == 2 - 1
end
um_metodo# true
def um_metodo "Opa!"end
um_metodo# "Opa!"def um_metodo (1..5).to_aend
um_metodo#[1,2,3,4,5]
def um_metodoreturn 1, 2, 3
end
a, b, c = um_metodo
puts a, b, c=> #1=> #2=> #3
Metaprogramação
class Fooend
Foo.class_eval dodefine_method("novo") do |arg|puts arg
endend
f = Foo.newf.novo("123") => # 123
class Foodef method_missing(name)puts "método #{name} desconhecido"
endend
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? endend
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? endend
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? endend
pane = javax.swing.JOptionPanelist = 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? endend
pane = javax.swing.JOptionPanelist = 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? endend
pane = javax.swing.JOptionPanelist = 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
DSLDomain 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 endend
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-bitlySuccessfully installed mime-types-1.16Successfully installed rest-client-1.6.0Successfully installed json_pure-1.4.3Successfully installed ruby-bitly-0.1.34 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.comShort 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 railsSuccessfully installed activesupport-3.0.1Successfully installed builder-2.1.2Successfully installed i18n-0.4.2Successfully installed activemodel-3.0.1Successfully installed rack-1.2.1Successfully installed rack-test-0.5.6Successfully installed rack-mount-0.6.13Successfully installed tzinfo-0.3.23Successfully installed abstract-1.0.0Successfully installed erubis-2.6.6Successfully installed actionpack-3.0.1Successfully installed arel-1.0.1Successfully installed activerecord-3.0.1Successfully installed activeresource-3.0.1Successfully installed polyglot-0.3.1Successfully installed treetop-1.4.8Successfully installed mail-2.2.9Successfully installed actionmailer-3.0.1Successfully installed thor-0.14.4Successfully installed railties-3.0.1Successfully installed rails-3.0.121 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 :nameend
class Task < ActiveRecord::Base validates_presence_of :name belongs_to :user has_many :statusesend
Quem usa Rails?
Como aprender?
aprendaaprogramar.rubyonrails.pro.br
Foi divertido? =D
Perguntas?
Obrigado!@rafaeldx7