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?

War es hilfreich?

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>

Defekt 17700


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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top