Was ist der Unterschied zwischen Ruby 1.8 und Ruby 1.9?

102

Die Unterschiede zwischen der "aktuellen" Version von Ruby (1.8) und der "neuen" Version (1.9) sind mir nicht klar. Gibt es eine "einfache" oder "einfache" Erklärung der Unterschiede und warum ist es so anders?

salt.racer
quelle
1
Ich nehme an, Sie meinen Ruby 1.8.6 - Ruby 1.8.7 hat viele Bibliothekskonstrukte ab 1.9.
Andrew Grimm
Ich betrachte die 1.8-Versionen nicht mehr als die "alten" und die 1.9.2+ als die "aktuellen". Ich verwende nur 1.8.7 für Kompatibilitätsprüfungen, entwickle aber in 1.9.2.
der Blechmann
5
@ Telemachos: Die Verbindung ist unterbrochen.
Andrew Grimm
1
@ Telemachus, Andrew Grimm - dieser Link zu archive.org funktioniert - web.archive.org/web/20090423003136/http://eigenclass.org/…
J. Merrill

Antworten:

170

Sam Ruby hat eine coole Diashow, die die Unterschiede umreißt .

Um diese Informationen zur leichteren Bezugnahme inline zu bringen und falls der Link in der abstrakten Zukunft nicht mehr funktioniert, finden Sie hier eine Übersicht über Sams Folien. Die Diashow ist weniger überwältigend zu überprüfen, aber es ist auch hilfreich, alles in einer solchen Liste zu haben.

Ruby 1.9 - Hauptfunktionen

  • Performance
  • Fäden / Fasern
  • Codierung / Unicode
  • Edelsteine ​​sind jetzt (meistens) eingebaut
  • if-Anweisungen führen keinen Gültigkeitsbereich in Ruby ein.

Was hat sich geändert?

Einzelne Zeichenketten.

Ruby 1.9

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

Ruby 1.8.6

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

String-Index.

Ruby 1.9

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

Ruby 1.8.6

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

{"a", "b"} Wird nicht mehr unterstützt

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}

Aktion: In {1 => 2} konvertieren


Array.to_s Enthält jetzt Interpunktion

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"

Aktion: Verwenden Sie stattdessen .join


Doppelpunkt nicht mehr gültig in When-Anweisungen

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

Aktion: Verwenden Sie dann Semikolon oder Zeilenumbruch


Variablen jetzt blockieren Lokale Variablen schattieren

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 Veraltet

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

Aktion: Verwenden Sie Hash.key


Fixnum.to_sym Jetzt weg

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

(Fortsetzung) 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-Schlüssel jetzt ungeordnet

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

Bestellung ist Einfügereihenfolge


Strengere reguläre Unicode-Ausdrücke

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

trund Regexpjetzt Unicode verstehen

Ruby 1.9

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

pack und 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 Brutaler als 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

Aktion: Verwenden Sie :: Math :: PI


Änderungen an der Delegation

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>

Defekt 17700


Die Verwendung von $ KCODE erzeugt Warnungen

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 Nun eine Reihe von Symbolen

Ruby 1.9

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

Ruby 1.8.6

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

Aktion: Ersetzen Sie instance_methods.include? mit method_defined?


Quelldatei-Codierung

Basic

# coding: utf-8

Emacs

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

Shebang

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

Echtes Einfädeln

  • Rennbedingungen
  • Implizite Bestellannahmen
  • Testcode

Was gibt's Neues?

Alternative Syntax für Symbol als Hash-Schlüssel

Ruby 1.9

{a: b}

redirect_to action: show

Ruby 1.8.6

{:a => b}

redirect_to :action => show

Lokale Variablen blockieren

Ruby 1.9

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

Injizieren Sie Methoden

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

Kein Block? Aufzählung!

Ruby 1.9

e = [1,2,3].each

Lambda-Kurzschrift

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)

Komplexe Zahlen

Ruby 1.9

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

Dezimal ist immer noch nicht die Standardeinstellung

Ruby 1.9

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

Regex "Eigenschaften"

Ruby 1.9

/\p{Space}/

Ruby 1.8.6

/[:space:]/

Splat in der Mitte

Ruby 1.9

def foo(first, *middle, last)

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

Fasern

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}

Werte brechen

Ruby 1.9

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

"Verschachtelte" Methoden

Ruby 1.9

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

HTH!

Tim Sullivan
quelle
3
HTH == "Hoffe das hilft". Ich musste das nachschlagen. Können Sie mich auf eine Antwort verweisen, die Sie gegeben haben und bei der Sie nicht gehofft haben, dass sie helfen würde?
Chris Wesseling
Oder meintest du glücklich zu helfen? Bitte entsprechend bearbeiten. Oder entfernen Sie es, wenn Ihr Glück / Ihre Hoffnung für alle Ihre Antworten zählt. ;-)
Chris Wesseling
10
Nein, ich werde es so lassen wie es ist. In Prozent der Gesamtantwort ist es winzig und jede Interpretation ist für mich in Ordnung. Vielen Dank.
Tim Sullivan
Laut dem von Ihnen angegebenen Link war die Änderung der Delegierung ein Fehler und wurde behoben.
Kyle Strand
Was ist mit der Inkonsistenz zwischen "Range.include"? Methode? Ruby v1.8.7 gibt ein anderes Ergebnis als v1.9
Lucas Pottersky
12

Ein großer Unterschied wäre der Wechsel von Matz 'Interpreter zu YARV , einer virtuellen Bytecode-Maschine, die die Leistung erheblich verbessert.

Sören Kuklau
quelle
4

Viele empfehlen jetzt die Ruby-Programmiersprache gegenüber der Spitzhacke - genauer gesagt, sie enthält alle Details der Unterschiede zwischen 1.8 und 1.9.

Dave Everitt
quelle
1
Ich mag sie beide. Das Pickaxe-Buch behandelt einige Dinge ausführlicher, aber die Ruby-Programmiersprache ist gut, wenn Sie schnell nach etwas suchen möchten. Es ist näher an einem "Nussschalen" Buch.
der Blechmann
1

Noch einige Änderungen:

Rückgabe eines Splat-Singleton-Arrays:

def function
  return *[1]
end

a=function
  • Rubin 1.9: [1]
  • Rubin 1,8: 1

Array-Argumente

def function(array)
  array.each { |v| p v }
end
function "1"
  • Rubin 1,8: "1"
  • ruby 1.9: undefinierte Methode `each 'für" 1 ": String
Wim Yedema
quelle