Algumas diferenças entre Ruby 1.8 e 1.9
Recentemente lancei a versão 0.1.0 do Outpost, um projeto que tenho na cabeça faz um século. Dessa forma, para vê-lo realizado, enviei-o como projeto pessoal para a minha turma do RMU, que foi agora em Janeiro.
A ideia foi um sucesso, consegui terminar boas partes do core do projeto e ele está de vento em popa. Porém uma das coisas do RMU é que basicamente só usávamos Ruby 1.9. De qualquer forma, resolvi publica-lo do mesmo jeito.
Enfim, descobri que o Outpost não rodava no Ruby 1.8. Os problemas foram:
!~ e != não são métodos de verdade
É natural usarmos =~
e ==
em nosso código no
dia-a-dia, e eles são métodos, como era de se esperar:
# Ruby 1.8
# =~
"abc" =~ /a/ # => 0
"abc".send('=~', /a/) # => 0
# ==
"abc" == "a" # => false
"abc".send('==', "a") # => false
Nada mais natural tentarmos usar sua negativa também, certo? Errado:
# Ruby 1.8
# !~
"abc" !~ /a/ # => false
"abc".send('!~', /a/) # => NoMethodError: undefined method `!~' for "abc":String
# !=
"abc" != "a" # => true
"abc".send('!=', "a") # => NoMethodError: undefined method `!=' for "abc":String
Vamos mais além! Vamos tentar implementar o método !=
:
# Ruby 1.8
class String
def !=(other)
# whatever
end
end
# syntax error, unexpected tNEQ
# def !=(other)
Ops! Nem conseguimos implementar o método, temos um erro de sintaxe. Agora tudo isso ocorre normalmente no Ruby 1.9, como esperado.
Símbolos não possuem alguns métodos, como upcase
# Ruby 1.8
:bla.upcase # NoMethodError: undefined method `upcase' for :bla:Symbol
# Ruby 1.9
:bla.upcase
# => :BLA
Initializers default diferem
# Ruby 1.8
class Bla; end
Bla.ancestors # => [Bla, Object, Kernel]
Bla.new # => #<Bla:0x101d7efe0>
Bla.new 1 # ArgumentError: wrong number of arguments (1 for 0)
# Ruby 1.9
Bla.ancestors # => [Bla, Object, Kernel, BasicObject]
Bla.new # => #<Bla:0x000001019ac6d8>
Bla.new 1 # => #<Bla:0x00000101953b28>
Bla.new 1,2,3,4 # => #<Bla:0x0000010193fb28>
Mas não é só isso
Esses detalhes na verdade são pequenos, mas que de fato passam despercebidos quando estamos implementando. Ainda bem que temos uma suite de testes, né? ;)
Para mais detalhes mais interessantes do que temos no Ruby 1.9, veja essa seleção especial das novas features.