Your SlideShare is downloading. ×
0
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-orien...
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...
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
...
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
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 desconheci...
Mais JRuby
fizzbuzz
def fizzbuzz(number)
resp = ""
resp.tap do
resp << "fizz" if number.modulo(3) == 0
resp << "buzz" if number.modulo(5) == 0...
def fizzbuzz(number)
resp = ""
resp.tap do
resp << "fizz" if number.modulo(3) == 0
resp << "buzz" if number.modulo(5) == 0...
def fizzbuzz(number)
resp = ""
resp.tap do
resp << "fizz" if number.modulo(3) == 0
resp << "buzz" if number.modulo(5) == 0...
def fizzbuzz(number)
resp = ""
resp.tap do
resp << "fizz" if number.modulo(3) == 0
resp << "buzz" if number.modulo(5) == 0...
require 'java'
def fizzbuzz(number)
resp = ""
resp.tap do
resp << "fizz" if number.modulo(3) == 0
resp << "buzz" if number...
$ 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....
# language: pt
Funcionalidade: Usuário gerenciando produtos
Como um usuário com permissão de gerenciar produtos
Com o obje...
RubyGems
$ gem install ruby-bitly
Successfully installed mime-types-1.16
Successfully installed rest-client-1.6.0
Successfully inst...
$ 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_xxxxxxxxxxxxx...
Um framework Web para Ruby
Extraído de uma aplicação real
Criado em julho/2004
É um conjunto de gems
Uma DSL para aplicaçõ...
Instalação do Rails
$ gem install rails
Successfully installed activesupport-3.0.1
Successfully installed builder-2.1.2
Su...
Criando uma aplicação Rails
$ rails new sc2010
create
create README
create Rakefile
create config.ru
create .gitignore
cre...
$ rails server
Vamos fazer alguma coisa...
$ rails generate scaffold task name:string done:boolean
invoke active_record
create db/migrate...
Criando o DB e iniciando o servidor
$ rake db:migrate
(in /Users/rafael/Sites/playground/sc2010)
== CreateTasks: migrating...
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
Ruby
Ruby
Ruby
Ruby
Ruby
Ruby
Ruby
Ruby
Ruby
Ruby
Ruby
Ruby
Ruby
Ruby
Ruby
Ruby
Ruby
Ruby
Ruby
Ruby
Ruby
Ruby
Ruby
Ruby
Ruby
Ruby
Ruby
Ruby
Ruby
Ruby
Ruby
Ruby
Ruby
Upcoming SlideShare
Loading in...5
×

Ruby

714

Published on

O que Ruby está trazendo ao mundo de desenvolvimento de software.

Published in: Technology, Education
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
714
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
6
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Transcript of "Ruby"

  1. 1. Ecossistema Ruby O que Ruby está trazendo ao mundo de desenvolvimento de software. @rafaeldx7
  2. 2. @rafaeldx7 Rafael Almeida de Carvalho
  3. 3. Ruby É uma linguagem de programação.
  4. 4. Interpretada Multiparadigma Tipagem Dinâmica Tipagem Forte Código Aberto
  5. 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. 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
  7. 7. Interpretadores
  8. 8. MRI Matz Ruby Interpreter
  9. 9. for .NET 4.0, Silverlight 4 and Windows Phone 7.
  10. 10. blá blá blá... CADÊ O CÓDIGO!?
  11. 11. Imprimir os números ímpares entre 1 e limit.
  12. 12. def impares(limit) 1.upto(limit).select { |n| n.odd? } end
  13. 13. Tipagem Dinâmica
  14. 14. nome = "Rafael" # => "Rafael" nome.class # => String nome = :rafael # => :rafael nome.class # => Symbol
  15. 15. Tipagem Forte!
  16. 16. ruby $> 1 + "1"
  17. 17. TypeError: String can't be coerced into Fixnum ! from (irb):21:in `+' ! from (irb):21 ruby $> 1 + "1"
  18. 18. TUDO é um objeto!
  19. 19. 3.times { puts "Hi!" } # Hi! # Hi! # Hi!
  20. 20. "Ruby eh show!".split.reverse
  21. 21. "Ruby eh show!".split.reverse => ["show!", "eh", "Ruby"]
  22. 22. true.class => TrueClass true.methods.count => 48 true.to_s => “true”
  23. 23. nil.class => NilClass 0.10.class => Float
  24. 24. Métodos são objetos!
  25. 25. 42.next # => 43 method = 42.method :next # => #<Method: Fixnum(Integer)#next> method.call # => 43 method.class # => Method
  26. 26. Operadores são Métodos
  27. 27. 2 + 2 # => 4 2.+(2) # => 4 2.public_methods.sort # => ["!", "!=", "!~", "%", "&", "*", "**", "+", "+@", "-", "-@", "/", "<", "<<","<=", "<=>", "==", "===", "=~", ">", ">=", ">>", "[]", "^", ... ]
  28. 28. class Fixnum def +(value) "#{self} + #{value}" end def ==(value) self * value end end puts 4 + 4 # => "4 + 4" puts 3 == 2 # => 6
  29. 29. Executar um método é enviar uma mensagem ao objeto.
  30. 30. 2 + 2 #=> 4 2.send('+', 2) => 4 ['rafael', 'dx7'].join => "rafaeldx7" ['rafael', 'dx7'].send(:join) => "rafaeldx7"
  31. 31. Métodos SEMPRE retornam valor!
  32. 32. 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]
  33. 33. def um_metodo return 1, 2, 3 end a, b, c = um_metodo puts a, b, c => #1 => #2 => #3
  34. 34. Metaprogramação
  35. 35. class Foo end Foo.class_eval do define_method("novo") do |arg| puts arg end end f = Foo.new f.novo("123") => # 123
  36. 36. class Foo def method_missing(name) puts "método #{name} desconhecido" end end f = Foo.new f.xpto => método xpto desconhecido
  37. 37. Mais JRuby
  38. 38. fizzbuzz
  39. 39. 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
  40. 40. 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
  41. 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 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
  42. 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 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)
  43. 43. 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)
  44. 44. $ ruby fizzbuzz.rb
  45. 45. $ ruby fizzbuzz.rb
  46. 46. $ ruby fizzbuzz.rb
  47. 47. DSL Domain Specific Language
  48. 48. 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
  49. 49. # 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
  50. 50. RubyGems
  51. 51. $ 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
  52. 52. $ bitly http://rafaeldx7.github.com Short url: http://bit.ly/aRr9aH Usando a gem em linha de comando
  53. 53. 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
  54. 54. 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
  55. 55. 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
  56. 56. 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
  57. 57. $ rails server
  58. 58. 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
  59. 59. 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
  60. 60. Uma tarefa precisa ter um nome class Task < ActiveRecord::Base validates_presence_of :name end
  61. 61. class Task < ActiveRecord::Base validates_presence_of :name belongs_to :user has_many :statuses end
  62. 62. Quem usa Rails?
  63. 63. Como aprender?
  64. 64. pine.fm/LearnToProgram
  65. 65. aprendaaprogramar.rubyonrails.pro.br
  66. 66. Foi divertido? =D
  67. 67. Perguntas?
  68. 68. Obrigado! @rafaeldx7
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×