Upgrade to Pro — share decks privately, control downloads, hide ads and more …

O que mudou no Ruby 2.0

O que mudou no Ruby 2.0

Veja a palestra apresentada no 29º GURU-SP.

Nando Vieira

April 13, 2013
Tweet

More Decks by Nando Vieira

Other Decks in Programming

Transcript

  1. RUBY 1.8 Se você ainda está usando Ruby 1.8, corra

    e atualize sua aplicação. Em junho esta versão deixará receber atualizações, inclusive de segurança.
  2. RUBY 1.9 O primeiro release estável saiu em dezembro de

    2009 e trouxe uma série de mudanças incompativeis com o Ruby 1.8.
  3. RUBY 2.0 Lançada em fevereiro de 2013, esta versão possui

    compatibilidade quase que total com o Ruby 1.9.
  4. Keyword Arguments Há sintaxe de hashes e argumentos nomeados foi

    proposta há quase 11 anos e, só agora, foi completamente implementada. http://fnando.me/d2
  5. class Sample def method_missing(name, *args, &block) p args end end

    sample = Sample.new sample.say :what, :are, :you, :doing? #=> [:what, :are, :you, :doing?]
  6. class Sample def method_missing(name, *args, **keys, &block) p keys end

    end sample = Sample.new sample.say what: "are", you: "doing?" #=> {:what=>"are", :you=>"doing?"}
  7. def params(a, b = nil, *args, c: nil, **kwords, &block)

    end [ [:req, :a], [:rest, :args], [:key, :c], [:keyrest, :kwords], [:block, :block] ]
  8. Literais no Ruby O Ruby possui muitos literais para de

    nir strings e arrays. Agora também podemos de nir arrays de símbolos.
  9. Encoding O encoding padrão do no Ruby 1.9 é US-ASCII.

    Para usar caracteres acentuados era preciso usar o magic comment.
  10. class MyClass foo_method = instance_method(:foo) define_method :foo do puts "before

    foo" result = foo_method.bind(self).call puts "after foo" result end end MyClass.new.foo #=> before foo #=> original #=> after foo
  11. De nir um alias para o método original e sobrescrever

    o método original com a nova implementação.
  12. class MyClass alias_method :foo_original, :foo def foo puts "before foo"

    result = foo_original puts "after foo" result end end MyClass.new.foo #=> before foo #=> original #=> after foo
  13. require "active_support/all" class MyClass def foo_with_puts puts "before foo" result

    = foo_without_puts puts "after foo" result end alias_method_chain :foo, :puts end MyClass.new.foo #=> before foo #=> original #=> after foo
  14. module FooExtension def foo puts "before foo" super puts "after

    foo" end end class MyClass prepend FooExtension end MyClass.new.foo #=> before foo #=> original #=> after foo
  15. Classes abertas Classes abertas e monkey patching sempre foi um

    motivo de preocupação dos iniciantes.
  16. Re nements O Re nements tenta amenizar esta situação permitindo

    fazer monkey patching de modo controlado.
  17. Re nements Existem tantas incertezas em relação ao re nements

    e isso é reforçado através de um warning ao usar o método Module.re ne.
  18. Regexp O Ruby 2.0 mudou seu engine de expressão regular

    mais uma vez. O Oniguruma saiu para dar lugar ao Onigmo.
  19. text = "Line 1\r\nLine 2\vLine 3\nLine 4" lines = text.split(/\R/)

    p lines #=> ["Line 1", "Line 2", "Line 3", "Line 4"]
  20. regex = /^(\[a-z]{2})(\1)?(?(2)([a-z]+)|(\d+))$/ "aaaabbbbb".match(regex) #<MatchData "aaaabbbbb" 1:"aa" 2:"aa" 3:"bbbbb" 4:nil>

    "ababccccc".match(regex) #<MatchData "ababccccc" 1:"ab" 2:"ab" 3:"ccccc" 4:nil> "ab1111111".match(regex) #<MatchData "ab1111111" 1:"ab" 2:nil 3:nil 4:"1111111"> "abccccccc".match(regex) # nil "1212ccccc".match(regex) # nil
  21. %[Line 1\nLine 2\nLine 3].lines #=> ["Line 1\n", "Line 2\n", "Line

    3"] %[abcdef].chars #=> ["a", "b", "c", "d", "e", "f"] %[abcdef].bytes #=> [97, 98, 99, 100, 101, 102] %[abcdef].codepoints #=> [97, 98, 99, 100, 101, 102]
  22. Enumerator#lazy O Ruby 2.0 introduziu um modo de criarmos enumerators

    que podem ser executados em conjuntos grandes ou mesmo in nitos.
  23. require "prime" range = (0..Float::INFINITY) primes = range.lazy .reject {|number|

    number < 50 } .select(&:prime?) .first(10) primes #=> [53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
  24. require "benchmark" require "prime" GC.disable range = (0..1000) cycles =

    1_000 def primes(range) range .reject {|number| number < 50 } .select(&:prime?) .first(10) end Benchmark.bmbm do |x| x.report("with lazy") do cycles.times { primes(range.lazy) } end x.report("without lazy") do cycles.times { primes(range) } end end
  25. Rehearsal ------------------------------------------------ with lazy 0.250000 0.020000 0.270000 ( 0.265709) without

    lazy 4.740000 0.390000 5.130000 ( 5.219114) --------------------------------------- total: 5.400000sec user system total real with lazy 0.260000 0.020000 0.280000 ( 0.280212) without lazy 5.090000 0.420000 5.510000 ( 5.576948)
  26. Muito mais! Backtrace otimizado, TracePoint, DTrace, __callee__, otimizações na VM

    (fork mais rápido), melhorias no Garbage Collector, Kernel#require mais rápido, Rubygems com suporte ao Gem le, e mais um monte de coisas!