Apa perbedaan antara Ruby 1.8 dan Ruby 1.9

102

Saya tidak mengerti dengan jelas perbedaan antara versi Ruby "saat ini" (1.8) dan versi "baru" (1.9). Adakah penjelasan yang "mudah" atau "sederhana" tentang perbedaan tersebut dan mengapa begitu berbeda?

salt.racer
sumber
1
Saya berasumsi maksud Anda Ruby 1.8.6 - Ruby 1.8.7 memiliki banyak konstruksi perpustakaan dari 1.9.
Andrew Grimm
Lebih lanjut, saya menganggap versi 1.8 sebagai versi "lama", dan 1.9.2+ sebagai versi "saat ini". Saya hanya menggunakan 1.8.7 untuk pemeriksaan kompatibilitas tetapi mengembangkan di 1.9.2.
Tin Man
5
@ Telemakus: Tautan rusak.
Andrew Grimm
1
@Telemachus, Andrew Grimm - tautan archive.org ini berfungsi - web.archive.org/web/20090423003136/http://eigenclass.org/…
J.Merrill

Jawaban:

170

Sam Ruby memiliki tayangan slide keren yang menjelaskan perbedaannya .

Untuk kepentingan membawa informasi ini sebaris untuk referensi yang lebih mudah, dan jika tautan mati di masa depan yang abstrak, berikut adalah ikhtisar dari slide Sam. Rangkai salindia tidak terlalu berlebihan untuk ditinjau, tetapi mengatur semuanya dalam daftar seperti ini juga membantu.

Ruby 1.9 - Fitur Utama

  • Performa
  • Benang / Serat
  • Pengkodean / Unicode
  • permata (kebanyakan) sudah ada di dalamnya sekarang
  • pernyataan if tidak memperkenalkan scope di Ruby.

Apa yang berubah?

String karakter tunggal.

Ruby 1.9

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

Ruby 1.8.6

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

Indeks string.

Ruby 1.9

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

Ruby 1.8.6

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

{"a", "b"} Tidak Lagi Didukung

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}

Tindakan: Ubah menjadi {1 => 2}


Array.to_s Sekarang Berisi Tanda Baca

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"

Tindakan: Gunakan .join sebagai gantinya


Colon Tidak Lagi Berlaku Di Saat Pernyataan

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

Tindakan: Gunakan titik koma, lalu, atau baris baru


Blokir Variabel Sekarang Bayangkan Variabel Lokal

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 Tidak digunakan lagi

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

Tindakan: Gunakan Hash.key


Fixnum.to_sym Sekarang Hilang

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

(Lanjutan) 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


Hash Keys Sekarang Tidak Berurutan

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"}

Urutan adalah urutan penyisipan


Ekspresi Reguler Unicode yang Lebih Ketat

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

trdan RegexpSekarang Pahami 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 dan 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 Lebih Brutal Daripada 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

Tindakan: Gunakan :: Matematika :: PI


Perubahan Delegasi

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>

Cacat 17700


Penggunaan $ KCODE Menghasilkan Peringatan

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 Sekarang Array of Symbols

Ruby 1.9

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

Ruby 1.8.6

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

Tindakan: Ganti instance_methods.include? dengan method_defined?


Pengkodean File Sumber

Dasar

# coding: utf-8

Emacs

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

Peristiwa

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

Threading Nyata

  • Kondisi Balapan
  • Asumsi Pengurutan Implisit
  • Kode Tes

Apa yang baru?

Sintaks Alternatif untuk Simbol sebagai Kunci Hash

Ruby 1.9

{a: b}

redirect_to action: show

Ruby 1.8.6

{:a => b}

redirect_to :action => show

Blok Variabel Lokal

Ruby 1.9

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

Metode Injeksi

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

Tidak ada blok? Enum!

Ruby 1.9

e = [1,2,3].each

Lambda Shorthand

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)

Bilangan Kompleks

Ruby 1.9

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

Desimal Masih Bukan Default

Ruby 1.9

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

Regex "Properti"

Ruby 1.9

/\p{Space}/

Ruby 1.8.6

/[:space:]/

Percikan di Tengah

Ruby 1.9

def foo(first, *middle, last)

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

Serat

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}

Break Values

Ruby 1.9

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

Metode "Bersarang"

Ruby 1.9

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

HTH!

Tim Sullivan
sumber
3
HTH == "Semoga membantu". Saya harus mencarinya. Dapatkah Anda menunjukkan kepada saya jawaban yang Anda berikan, di mana Anda tidak berharap itu akan membantu?
Chris Wesseling
Atau apakah maksud Anda Senang membantu? Harap edit seperlunya. Atau hapus, jika kebahagiaan / harapan Anda penting untuk semua jawaban Anda. ;-)
Chris Wesseling
10
Tidak, saya akan membiarkannya apa adanya. Sebagai persentase dari total jawaban, itu sangat kecil dan interpretasi baik-baik saja bagi saya. Terima kasih.
Tim Sullivan
Menurut tautan yang Anda berikan, perubahan delegasi adalah bug dan telah diperbaiki.
Kyle Strand
Bagaimana dengan ketidakkonsistenan antara "Range.include?" metode? Ruby v1.8.7 memberikan hasil yang berbeda dari v1.9
Lucas Pottersky
12

Satu perbedaan besar adalah perpindahan dari interpreter Matz ke YARV , mesin virtual bytecode yang membantu kinerja secara signifikan.

Sören Kuklau
sumber
4

Banyak yang sekarang merekomendasikan Bahasa Pemrograman Ruby daripada Beliung - lebih tepatnya, ia memiliki semua detail perbedaan 1.8 / 1.9.

Dave Everitt
sumber
1
Saya menyukai keduanya. Buku Pickaxe membahas beberapa hal dengan lebih lengkap tetapi Ruby Programming Language bagus ketika Anda ingin memindai sesuatu dengan cepat. Ini lebih dekat dengan buku "singkatnya".
Tin Man
1

Beberapa perubahan lagi:

Mengembalikan larik tunggal percikan:

def function
  return *[1]
end

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

argumen array

def function(array)
  array.each { |v| p v }
end
function "1"
  • ruby 1.8: "1"
  • ruby 1.9: metode tidak terdefinisi `each 'for" 1 ": String
Wim Yedema
sumber