Was ist der Unterschied zwischen Ruby 1.8 und Ruby 1.9?
Frage
Mir sind die Unterschiede zwischen der „aktuellen“ Version von Ruby (1.8) und der „neuen“ Version (1.9) nicht klar.Gibt es eine „einfache“ oder „einfache“ Erklärung für die Unterschiede und warum sie so unterschiedlich sind?
Lösung
Sam Ruby hat eine Coole Diashow, die die Unterschiede verdeutlicht.
Um diese Informationen zur einfacheren Bezugnahme inline zu integrieren und für den Fall, dass der Link in der Zukunft nicht mehr funktioniert, finden Sie hier eine Übersicht über Sams Folien.Die Diashow ist weniger überwältigend anzusehen, aber es ist auch hilfreich, alles in einer Liste wie dieser aufzulisten.
Ruby 1.9 – Hauptfunktionen
- Leistung
- Fäden/Fasern
- Kodierung/Unicode
- gems ist jetzt (größtenteils) integriert
- if-Anweisungen führen in Ruby keinen Gültigkeitsbereich 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: Konvertieren in {1 => 2}
Array.to_s
Enthält jetzt Satzzeichen
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
Doppelpunkte sind in When-Anweisungen nicht mehr gültig
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 ein Semikolon oder einen Zeilenumbruch
Blockvariablen beschatten jetzt lokale Variablen
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"}
Auftrag ist Einfügungsauftrag
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
tr
Und Regexp
Jetzt verstehen Sie 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
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
Delegationsänderungen
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>
Die Verwendung von $KCODE führt zu 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
Jetzt 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: Instanz_methods.include ersetzen?mit method_definiert?
Kodierung der Quelldatei
Basic
# coding: utf-8
Emacs
# -*- encoding: utf-8 -*-
Scheiße
#!/usr/local/rubybook/bin/ruby
# encoding: utf-8
Echtes Einfädeln
- Rennbedingungen
- Implizite Ordnungsannahmen
- Testcode
Was ist neu?
Alternative Syntax für Symbole 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}
Injektionsmethoden
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:]/
Platsch 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!
Andere Tipps
Ein großer Unterschied wäre der Wechsel von Matz' Dolmetscher zu YARV, eine virtuelle Bytecode-Maschine, die die Leistung erheblich steigert.
Viele empfehlen es mittlerweile weiter Die Ruby-Programmiersprache gegenüber der Spitzhacke – genauer gesagt, es enthält alle Details der 1,8/1,9-Unterschiede.
Einige weitere Änderungen:
Zurückgeben 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“
- Rubin 1.9:undefinierte Methode „each“ für „1“:String