O documento resume as principais mudanças na versão 1.9 do Ruby em relação à versão 1.8, incluindo:
1) Mudanças na representação de strings e codificações, como a remoção do $KCODE e a introdução de m17n;
2) Melhorias no desempenho de expressões regulares e símbolos;
3) Alterações na classe Date e nos métodos de hash.
10. m17n
em todos os lugares
Em IO
f = File.open("file.txt", "r:utf-8")
f.external_encoding #=> utf-8
f = File.open("file.txt", "w+:utf-8:iso-8859-1")
f.external_encoding #=> utf-8
f.internal_encoding #=> iso-8859-1
f = File.open("img.png", "r:binary")
f.encoding #=> ASCII-8BIT
11. strings
codificação
"maçã".length
1.8 #=> 6
"abcd"[0]
#=> 97
"maçã".length
1.9 #=> 4
"abcd"[0]
#=> a
"abcd".codepoints.to_a[0]
Retorna a representação
#=> 97 numérica dos caracteres
"abcd"[0].ord
#=> 97
14. símbolos
string-wannabe
• pode ser comparado com regexes
• pode ser acessado como strings
• possui muitos métodos da classe String
• :symbol.to_s é menos frequente
16. símbolos
blocos
• to_proc agora é nativo
• é muito rápido
chars = %w(a b c d)
1_000_000.times { chars.collect(&:upcase) }
user system total real
1.8 16.380000 3.700000 20.080000 20.333704
user system total real
1.9 5.300000 0.040000 5.340000 5.365868
27. lambda
funções anônimas
sum = lambda {|*args| args.reduce(:+) }
1.8 sum = lambda {|*args| args.inject(0) {|s,n| s += n; s } }
1.9 sum = -> *args { args.reduce(:+) }
sum.call(1,2,3)
#=> 6
sum[1,2,3]
#=> 6
sum.(1,2,3) Ruby 1.9
#=> 6
28. basic object
começando do zero
BasicObject.superclass
#=> nil
Object.superclass
#=> BasicObject
BasicObject.instance_methods
#=> [:==, :equal?, :!, :!=, :instance_eval, :instance_exec, :__send__]
class MyClass < BasicObject; end
29. object
#tap
user = User.new.tap do |u|
1.9 u.name = "Nando Vieira"
u.blog = "http://simplesideias.com.br"
end
30. bloco
escopo de variáveis
n = 0
1.8
(1..10).each do |n|
end
#=> n = 10
n = 0 n = 1
1.9
(1..10).each do |n| lambda {|;n| n = 2 }.call
end
#=> n = 1
#=> n = 0
31. suporte
como lidar com ambas as versões
class Sample
if String.method_defined?(:encode)
def some_method
end
else
def some_method
end
end
end
32. suporte
como lidar com ambas as versões
unless String.method_defined?(:encode)
class String
def encode(*options)
end
end
end
33. mais mudanças
operador *splat
def group(a, b, *c)
1.8 [a, b, c]
end
group(1,2,3,4,5)
#=> [1, 2, [3, 4, 5]]
def group(a, *b, c)
1.9 [a, b, c]
end
group(1,2,3,4,5)
#=> [1, [2, 3, 4], 5]
34. mais mudanças
valor padrão de argumentos
def color(type, value)
1.8 end
Como fazer "type" ser "hex" por padrão?
color(:rgb, [255, 255, 255]) a) Precisa mudar a ordem dos parâmetros
color([255, 255, 255]) b) Sempre especificar os 2 parâmetros (?)
def color(type=:hex, value)
1.9 end
color(:rgb, [255, 255, 255])
color("#fff")
35. mais mudanças
standard library + bundles
• rubygems, rake, rdoc
• fiber, enumerator, json (ext + pure), minitest,
ripper, securerandom, probeprofiler
• csv foi substituída por fastcsv
• soap e wsdl foram removidas
36. mas e aí?
migrar ou não migrar para o Ruby 1.9?
• todas as gems foram portadas
• uma parte do sistema pode ser portada
isitruby19.com
37. mas e aí?
migrar ou não migrar para o Ruby 1.9?
testes
pelo menos as partes críticas