vinibaggio.net

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.


Written by Vinicius Baggio Fuentes, who works in tech in NY and loves being in the kitchen in the remaining time. Twitter Instagram