Qual é a diferença entre Ruby 1.8 e Ruby 1.9

102

Não estou claro sobre as diferenças entre a versão "atual" do Ruby (1.8) e a "nova" versão (1.9). Existe uma explicação "fácil" ou "simples" das diferenças e por que é tão diferente?

salt.racer
fonte
1
Suponho que você queira dizer Ruby 1.8.6 - Ruby 1.8.7 tem muitas construções de biblioteca a partir do 1.9.
Andrew Grimm
Além disso, considero as versões 1.8 as versões "antigas" e 1.9.2+ as "atuais". Eu só uso 1.8.7 para verificações de compatibilidade, mas desenvolvo em 1.9.2.
o Homem de Lata de
5
@Telemachus: O link está quebrado.
Andrew Grimm,
1
@Telemachus, Andrew Grimm - este link archive.org funciona - web.archive.org/web/20090423003136/http://eigenclass.org/…
J.Merrill de

Respostas:

170

Sam Ruby tem um slideshow legal que mostra as diferenças .

No interesse de trazer essas informações embutidas para referência mais fácil e no caso de o link ficar inativo em um futuro abstrato, aqui está uma visão geral dos slides de Sam. A apresentação de slides é menos complicada de revisar, mas ter tudo em uma lista como esta também é útil.

Ruby 1.9 - Principais recursos

  • atuação
  • Fios / Fibras
  • Codificação / Unicode
  • gems está (principalmente) integrado agora
  • instruções if não introduzem escopo em Ruby.

O que mudou?

Sequências de caracteres únicos.

Ruby 1.9

irb(main):001:0> ?c
=> "c"

Ruby 1.8.6

irb(main):001:0> ?c
=> 99

Índice de string.

Ruby 1.9

irb(main):001:0> "cat"[1]
=> "a"

Ruby 1.8.6

irb(main):001:0> "cat"[1]
=> 97

{"a", "b"} Não há mais suporte

Ruby 1.9

irb(main):002:0> {1,2}
SyntaxError: (irb):2: syntax error, unexpected ',', expecting tASSOC

Ruby 1.8.6

irb(main):001:0> {1,2}
=> {1=>2}

Ação: Converter para {1 => 2}


Array.to_s Agora contém pontuação

Ruby 1.9

irb(main):001:0> [1,2,3].to_s
=> "[1, 2, 3]"

Ruby 1.8.6

irb(main):001:0> [1,2,3].to_s
=> "123"

Ação: use .join em vez disso


Os dois pontos não são mais válidos nas declarações When

Ruby 1.9

irb(main):001:0> case 'a'; when /\w/: puts 'word'; end
SyntaxError: (irb):1: syntax error, unexpected ':',
expecting keyword_then or ',' or ';' or '\n'

Ruby 1.8.6

irb(main):001:0> case 'a'; when /\w/: puts 'word'; end
word

Ação: use ponto-e-vírgula ou nova linha


Block Variables Now Shadow Local Variables

Ruby 1.9

irb(main):001:0> i=0; [1,2,3].each {|i|}; i
=> 0
irb(main):002:0> i=0; for i in [1,2,3]; end; i
=> 3

Ruby 1.8.6

irb(main):001:0> i=0; [1,2,3].each {|i|}; i
=> 3

Hash.index Descontinuada

Ruby 1.9

irb(main):001:0> {1=>2}.index(2)
(irb):18: warning: Hash#index is deprecated; use Hash#key
=> 1
irb(main):002:0> {1=>2}.key(2)
=> 1

Ruby 1.8.6

irb(main):001:0> {1=>2}.index(2)
=> 1

Ação: Use Hash.key


Fixnum.to_sym Agora se foi

Ruby 1.9

irb(main):001:0> 5.to_sym
NoMethodError: undefined method 'to_sym' for 5:Fixnum

Ruby 1.8.6

irb(main):001:0> 5.to_sym
=> nil

(Continua) Ruby 1.9

# Find an argument value by name or index.
def [](index)
  lookup(index.to_sym)
end

svn.ruby-lang.org/repos/ruby/trunk/lib/rake.rb


Chaves de hash agora não ordenadas

Ruby 1.9

irb(main):001:0> {:a=>"a", :c=>"c", :b=>"b"}
=> {:a=>"a", :c=>"c", :b=>"b"}

Ruby 1.8.6

irb(main):001:0> {:a=>"a", :c=>"c", :b=>"b"}
=> {:a=>"a", :b=>"b", :c=>"c"}

O pedido é um pedido de inserção


Expressões regulares Unicode mais estritas

Ruby 1.9

irb(main):001:0> /\x80/u
SyntaxError: (irb):2: invalid multibyte escape: /\x80/

Ruby 1.8.6

irb(main):001:0> /\x80/u
=> /\x80/u

tre Regexpagora entenda Unicode

Ruby 1.9

unicode(string).tr(CP1252_DIFFERENCES, UNICODE_EQUIVALENT).
  gsub(INVALID_XML_CHAR, REPLACEMENT_CHAR).
  gsub(XML_PREDEFINED) {|c| PREDEFINED[c.ord]}

pack e unpack

Ruby 1.8.6

def xchr(escape=true)
  n = XChar::CP1252[self] || self
  case n when *XChar::VALID
    XChar::PREDEFINED[n] or 
      (n>128 ? n.chr : (escape ? "&##{n};" : [n].pack('U*')))
  else
    Builder::XChar::REPLACEMENT_CHAR
  end
end
unpack('U*').map {|n| n.xchr(escape)}.join

BasicObject Mais brutal do que BlankSlate

Ruby 1.9

irb(main):001:0> class C < BasicObject; def f; Math::PI; end; end; C.new.f
NameError: uninitialized constant C::Math

Ruby 1.8.6

irb(main):001:0> require 'blankslate'
=> true
irb(main):002:0> class C < BlankSlate; def f; Math::PI; end; end; C.new.f
=> 3.14159265358979

Ação: Use :: Math :: PI


Mudanças de delegação

Ruby 1.9

irb(main):002:0> class C < SimpleDelegator; end
=> nil
irb(main):003:0> C.new('').class
=> String

Ruby 1.8.6

irb(main):002:0> class C < SimpleDelegator; end
=> nil
irb(main):003:0> C.new('').class
=> C
irb(main):004:0>

Defeito 17700


O uso de $ KCODE produz avisos

Ruby 1.9

irb(main):004:1> $KCODE = 'UTF8'
(irb):4: warning: variable $KCODE is no longer effective; ignored
=> "UTF8"

Ruby 1.8.6

irb(main):001:0> $KCODE = 'UTF8'
=> "UTF8"

instance_methods Agora uma série de símbolos

Ruby 1.9

irb(main):001:0> {}.methods.sort.last
=> :zip

Ruby 1.8.6

irb(main):001:0> {}.methods.sort.last
=> "zip"

Ação: Substituir instance_methods.include? com method_defined?


Codificação do arquivo fonte

Básico

# coding: utf-8

Emacs

# -*- encoding: utf-8 -*-

Shebang

#!/usr/local/rubybook/bin/ruby
# encoding: utf-8

Threading real

  • Condições da corrida
  • Suposições implícitas de pedidos
  • Código de Teste

O que há de novo?

Sintaxe alternativa para símbolo como chaves de hash

Ruby 1.9

{a: b}

redirect_to action: show

Ruby 1.8.6

{:a => b}

redirect_to :action => show

Variáveis ​​locais do bloco

Ruby 1.9

[1,2].each {|value; t| t=value*value}

Métodos de injeção

Ruby 1.9

[1,2].inject(:+)

Ruby 1.8.6

[1,2].inject {|a,b| a+b}

to_enum

Ruby 1.9

short_enum = [1, 2, 3].to_enum
long_enum = ('a'..'z').to_enum
loop do
  puts "#{short_enum.next} #{long_enum.next}"
end

Sem bloqueio? Enum!

Ruby 1.9

e = [1,2,3].each

Lambda Taquigrafia

Ruby 1.9

p = -> a,b,c {a+b+c}
puts p.(1,2,3)
puts p[1,2,3]

Ruby 1.8.6

p = lambda {|a,b,c| a+b+c}
puts p.call(1,2,3)

Números complexos

Ruby 1.9

Complex(3,4) == 3 + 4.im

Decimal ainda não é o padrão

Ruby 1.9

irb(main):001:0> 1.2-1.1
=> 0.0999999999999999

Regex “Propriedades”

Ruby 1.9

/\p{Space}/

Ruby 1.8.6

/[:space:]/

Splat no meio

Ruby 1.9

def foo(first, *middle, last)

(->a, *b, c {p a-c}).(*5.downto(1))

Fibras

Ruby 1.9

f = Fiber.new do
  a,b = 0,1
  Fiber.yield a
  Fiber.yield b
  loop do
    a,b = b,a+b
    Fiber.yield b
  end
end
10.times {puts f.resume}

Quebrar valores

Ruby 1.9

match =
   while line = gets
     next if line =~ /^#/
     break line if line.find('ruby')
   end

Métodos “aninhados”

Ruby 1.9

def toggle
  def toggle
    "subsequent times"
  end
  "first time"
end

HTH!

Tim Sullivan
fonte
3
HTH == "Espero que ajude". Eu tive que pesquisar isso. Você pode me indicar uma resposta que você forneceu, na qual você não esperava que ajudasse?
Chris Wesseling,
Ou você quis dizer Feliz em ajudar? Edite de acordo. Ou remova-o, se sua felicidade / esperança contar para todas as suas respostas. ;-)
Chris Wesseling,
10
Não, vou deixar como está. Como uma porcentagem da resposta total, é minúscula e qualquer interpretação é boa para mim. Obrigado.
Tim Sullivan,
De acordo com o link que você forneceu, a mudança na delegação era um bug e foi corrigido.
Kyle Strand
E quanto à inconsistência entre "Range.include?" método? Ruby v1.8.7 dá um resultado diferente de v1.9
Lucas Pottersky
12

Uma grande diferença seria a mudança do intérprete de Matz para YARV , uma máquina virtual de bytecode que ajuda significativamente no desempenho.

Sören Kuklau
fonte
4

Muitos agora recomendam The Ruby Programming Language em vez da Pickaxe - mais precisamente, ela tem todos os detalhes das diferenças 1.8 / 1.9.

Dave Everitt
fonte
1
Eu gosto dos dois. O livro Pickaxe discute algumas coisas de forma mais completa, mas a linguagem de programação Ruby é boa quando você deseja procurar algo rapidamente. Está mais perto de um livro "resumido".
o Homem de Lata de
1

Mais algumas mudanças:

Retornando uma matriz splat singleton:

def function
  return *[1]
end

a=function
  • rubi 1.9: [1]
  • rubi 1.8: 1

argumentos de matriz

def function(array)
  array.each { |v| p v }
end
function "1"
  • rubi 1.8: "1"
  • ruby 1.9: método indefinido `each 'para" 1 ": String
Wim Yedema
fonte