Ruby 1.8 ve Ruby 1.9 arasındaki fark nedir


102

Ruby'nin "mevcut" sürümü (1.8) ile "yeni" sürüm (1.9) arasındaki farklar konusunda net değilim. Farklılıkların "kolay" veya "basit" bir açıklaması var mı ve neden bu kadar farklı?


1
Ruby 1.8.6 - Ruby 1.8.7'nin 1.9'dan itibaren çok sayıda kütüphane yapısı olduğunu kastettiğinizi varsayıyorum.
Andrew Grimm

Artık 1.8 sürümlerini "eski" sürümler ve 1.9.2+ sürümlerini de "güncel" sürümler olarak görüyorum. Uyumluluk kontrolleri için yalnızca 1.8.7 kullanıyorum ancak 1.9.2'de geliştiriyorum.
The Tin Man

5
@Telemachus: Bağlantı koptu.
Andrew Grimm

1
@Telemachus, Andrew Grimm - bu archive.org bağlantısı çalışıyor - web.archive.org/web/20090423003136/http://eigenclass.org/…
J.Merrill

Yanıtlar:


170

Sam Ruby'nin farklılıkları özetleyen harika bir slayt gösterisi var .

Bu bilgiyi daha kolay referans için satır içine getirmek amacıyla ve bağlantının soyut gelecekte kesilmesi durumunda, burada Sam'in slaytlarına genel bir bakış. Slayt gösterisinin incelenmesi daha az zorlayıcıdır, ancak hepsinin böyle bir listede yer alması da yararlıdır.

Ruby 1.9 - Başlıca Özellikler

  • Verim
  • İplikler / Lifler
  • Kodlama / Unicode
  • taşlar artık (çoğunlukla) yerleşiktir
  • eğer ifadeler Ruby'de kapsam sağlamaz.

Ne değişti?

Tek karakter dizileri.

Yakut 1.9

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

Yakut 1.8.6

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

Dize indeksi.

Yakut 1.9

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

Yakut 1.8.6

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

{"a", "b"} Artık Desteklenmiyor

Yakut 1.9

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

Yakut 1.8.6

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

İşlem: {1 => 2} biçimine dönüştür


Array.to_s Şimdi Noktalama İşaretleri İçeriyor

Yakut 1.9

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

Yakut 1.8.6

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

Eylem: Bunun yerine .join kullanın


Kolon İfadelerde Artık Geçerli Değil

Yakut 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'

Yakut 1.8.6

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

İşlem: Noktalı virgül, sonra veya yeni satır kullanın


Değişkenleri Şimdi Engelleyin Yerel Değişkenleri Gölgelendirin

Yakut 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

Yakut 1.8.6

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

Hash.index Kullanımdan kaldırıldı

Yakut 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

Yakut 1.8.6

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

Eylem: Hash.key kullan


Fixnum.to_sym Şimdi gitti

Yakut 1.9

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

Yakut 1.8.6

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

(Devamı) 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 Anahtarları Artık Sıralanmamış

Yakut 1.9

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

Yakut 1.8.6

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

Sipariş, kampanya siparişidir


Daha Katı Unicode Normal İfadeler

Yakut 1.9

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

Yakut 1.8.6

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

trve RegexpŞimdi Unicode'u Anlayın

Yakut 1.9

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

pack ve unpack

Yakut 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 Daha Acımasız BlankSlate

Yakut 1.9

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

Yakut 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

Eylem: Kullanım :: Matematik :: PI


Yetki Değişiklikleri

Yakut 1.9

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

Yakut 1.8.6

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

Kusur 17700


$ KCODE Kullanımı Uyarılar Üretir

Yakut 1.9

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

Yakut 1.8.6

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

instance_methods Şimdi bir Sembol Dizisi

Yakut 1.9

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

Yakut 1.8.6

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

Eylem: instance_methods.include değiştirilsin mi? method_defined ile?


Kaynak Dosya Kodlaması

Temel

# coding: utf-8

Emacs

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

Shebang

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

Gerçek Diş Açma

  • Yarış koşulları
  • Örtük Sıralama Varsayımları
  • Test Kodu

Ne var ne yok?

Hash Anahtarları Olarak Sembol için Alternatif Sözdizimi

Yakut 1.9

{a: b}

redirect_to action: show

Yakut 1.8.6

{:a => b}

redirect_to :action => show

Yerel Değişkenleri Engelle

Yakut 1.9

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

Enjeksiyon Yöntemleri

Yakut 1.9

[1,2].inject(:+)

Yakut 1.8.6

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

to_enum

Yakut 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

Blok yok mu? Sıralama!

Yakut 1.9

e = [1,2,3].each

Lambda Shorthand

Yakut 1.9

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

Yakut 1.8.6

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

Karışık sayılar

Yakut 1.9

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

Ondalık Hala Varsayılan Değil

Yakut 1.9

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

Normal ifade "Özellikler"

Yakut 1.9

/\p{Space}/

Yakut 1.8.6

/[:space:]/

Ortada uyarısı

Yakut 1.9

def foo(first, *middle, last)

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

Lifler

Yakut 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 Değerleri

Yakut 1.9

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

"Yuvalanmış" Yöntemler

Yakut 1.9

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

HTH!


3
HTH == "Umarım yardımcı olur". Buna bakmak zorundaydım. Bana yardım edeceğini ummadığınız bir cevaba yönlendirebilir misiniz?
Chris Wesseling

Yoksa yardımcı olmaktan mutlu muydunuz? Lütfen uygun şekilde düzenleyin. Ya da mutluluğunuz / umudunuz tüm cevaplarınız için önemliyse, onu kaldırın. ;-)
Chris Wesseling

10
Hayır, olduğu gibi bırakacağım. Toplam cevabın yüzdesi olarak, bu çok küçük ve her iki yorum da benim için uygun. Teşekkürler.
Tim Sullivan

Sağladığınız bağlantıya göre, yetkilendirmedeki değişiklik bir hataydı ve düzeltildi.
Kyle Strand

"Range.include" arasındaki tutarsızlık ne olacak? yöntem? Ruby v1.8.7, v1.9'dan farklı bir sonuç veriyor
Lucas Pottersky

12

Büyük bir fark, Matz'ın yorumlayıcısından performansa önemli ölçüde yardımcı olan bir bayt kodu sanal makinesi olan YARV'a geçiş olacaktır .


4

Birçoğu artık Kazma yerine Ruby Programlama Dilini tavsiye ediyor - daha da önemlisi, 1.8 / 1.9 farklarının tüm ayrıntılarına sahip.


1
İkisini de beğeniyorum. Kazma kitabı bazı şeyleri daha kapsamlı bir şekilde tartışır, ancak Ruby Programlama Dili bir şeyi hızlı bir şekilde taramak istediğinizde iyidir. "Özetle" bir kitaba daha yakın.
The Tin Man

1

Birkaç değişiklik daha:

Bir uyarıcı tekil dizi döndürmek:

def function
  return *[1]
end

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

dizi argümanları

def function(array)
  array.each { |v| p v }
end
function "1"
  • ruby 1.8: "1"
  • ruby 1.9: "1" için tanımsız yöntem "her": Dize
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.