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.
Slide 8
Slide 8 text
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.
Slide 9
Slide 9 text
RUBY 2.0
Lançada em fevereiro de 2013, esta versão
possui compatibilidade quase que total
com o Ruby 1.9.
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
Slide 15
Slide 15 text
def currency(number, options = {})
end
Slide 16
Slide 16 text
precision = options.fetch(:precision, 3)
unit = options.fetch(:unit, "$")
format = options.fetch(:format, "%u%n")
Slide 17
Slide 17 text
def currency(number, format: "%u%n", unit: "$", precision: 3)
end
Slide 18
Slide 18 text
Exceções
A exceção ArgumentError é lançada se um
argumento não esperado for passado.
Literais no Ruby
O Ruby possui muitos literais para de nir
strings e arrays. Agora também podemos
de nir arrays de símbolos.
Slide 28
Slide 28 text
platforms = [:mac, :linux, :windows]
platforms = %i[ mac linux windows ]
Slide 29
Slide 29 text
p %i[#{Time.now}]
#=> [:"\#{Time.now}"]
p %I[#{Time.now}]
#=> [:"2013-04-13 02:05:58 -0300"]
Slide 30
Slide 30 text
Encoding
O encoding padrão do no Ruby 1.9 é
US-ASCII. Para usar caracteres acentuados
era preciso usar o magic comment.
Slide 31
Slide 31 text
puts __ENCODING__
#=> US-ASCII
text = "áéíóú"
puts text
#=> invalid multibyte char (US-ASCII)
Slide 32
Slide 32 text
puts __ENCODING__
#=> UTF-8
text = "áéíóú"
puts text
#=> áéíóú
Slide 33
Slide 33 text
Module#prepend
Altera a hierarquia de classes e módulos,
adicionando um módulo antes da própria
classe.
Slide 34
Slide 34 text
class MyClass
def foo
puts "foo"
end
end
Slide 35
Slide 35 text
De nir um novo método,
sobrescrevendo a
implementação original.
Slide 36
Slide 36 text
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
Slide 37
Slide 37 text
De nir um alias para o
método original e
sobrescrever o método
original com a nova
implementação.
Slide 38
Slide 38 text
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
Slide 39
Slide 39 text
Usar o método
Module#alias_method_chain
, que segue a mesma ideia da
implementação com alias.
Slide 40
Slide 40 text
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
Slide 41
Slide 41 text
Usar o método
Module#prepend para
alterar a hierarquia de classes
e módulos.
Slide 42
Slide 42 text
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
Slide 43
Slide 43 text
Hierarquia
Como o módulo FooExtensions foi
adicionado antes da própria classe
MyClass, é possível chamar o super.
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
Slide 76
Slide 76 text
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)
Slide 77
Slide 77 text
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!