Je ne suis pas clair sur les différences entre la version "actuelle" de Ruby (1.8) et la "nouvelle" version (1.9). Existe-t-il une explication «facile» ou «simple» des différences et pourquoi est-ce si différent?
Réponses
Trop de publicités?Sam Ruby a une cool diaporama qui expliquent les différences.
Dans l'intérêt d'apporter cette information en ligne pour une consultation plus facile, et dans le cas où le lien est mort dans l'abstrait avenir, voici un aperçu de Sam diapositives. Le diaporama est moins écrasante à l'examen, mais ayant tout mis dans une liste comme ça, c'est utile.
Ruby 1.9 - Principales Caractéristiques
- Performance
- Fils De Fibres
- L'Encodage Unicode/
- gemmes est (principalement) intégré maintenant
- si les déclarations ne pas introduire de champ d'application en Ruby.
Ce qui a changé?
Seul les chaînes de caractères.
Ruby 1.9
irb(main):001:0> ?c
=> "c"
Ruby 1.8.6
irb(main):001:0> ?c
=> 99
Index de chaîne.
Ruby 1.9
irb(main):001:0> "cat"[1]
=> "a"
Ruby 1.8.6
irb(main):001:0> "cat"[1]
=> 97
{"a","b"} N'est Plus pris en charge
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}
Action: Convertir {1 => 2}
Array.to_s
Maintenant Contient Des Signes De Ponctuation
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"
Action: Utiliser .rejoindre la place
Le Colon N'Est Plus Valable Lorsque Les Déclarations
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
Action: Utilisez le point-virgule, puis, ou de saut de ligne
Variables De Bloc Maintenant L'Ombre Des Variables Locales
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
Obsolète
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
Action: Utiliser Hachage.clé
Fixnum.to_sym
Maintenant Disparu
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
(Suite) 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
Clés De Hachage Maintenant Non Ordonnée
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"}
L'ordre est l'ordre d'insertion
Unicode Plus Stricte Des Expressions Régulières
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
et Regexp
Maintenant Comprendre 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
et 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
Plus Brutal Que 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
Action: Utilisez ::Math::PI
Délégation Des Changements
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>
Utilisation de $KCODE Produit des Avertissements
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
Maintenant un Tableau de Symboles
Ruby 1.9
irb(main):001:0> {}.methods.sort.last
=> :zip
Ruby 1.8.6
irb(main):001:0> {}.methods.sort.last
=> "zip"
Action: Remplacer instance_methods.inclure? avec method_defined?
Source Codage De Fichier
De base
# coding: utf-8
Emacs
# -*- encoding: utf-8 -*-
Shebang
#!/usr/local/rubybook/bin/ruby
# encoding: utf-8
Réelle De Filetage
- Des Conditions De Course
- Implicite De La Commande Hypothèses
- Le Code De Test
Quoi de neuf?
La Syntaxe alternative pour Symbole en tant que Clés de Hachage
Ruby 1.9
{a: b}
redirect_to action: show
Ruby 1.8.6
{:a => b}
redirect_to :action => show
Bloc De Variables Locales
Ruby 1.9
[1,2].each {|value; t| t=value*value}
Injecter Des Méthodes
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
Pas de bloc? Enum!
Ruby 1.9
e = [1,2,3].each
Lambda Abréviation
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)
Nombres Complexes
Ruby 1.9
Complex(3,4) == 3 + 4.im
Virgule Est Toujours Pas La Valeur Par Défaut
Ruby 1.9
irb(main):001:0> 1.2-1.1
=> 0.0999999999999999
L'Expression Rationnelle "Propriétés"
Ruby 1.9
/\p{Space}/
Ruby 1.8.6
/[:space:]/
Dispensées en Milieu
Ruby 1.9
def foo(first, *middle, last)
(->a, *b, c {p a-c}).(*5.downto(1))
Les fibres
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}
La Rupture Des Valeurs
Ruby 1.9
match =
while line = gets
next if line =~ /^#/
break line if line.find('ruby')
end
"Imbriqués" Méthodes
Ruby 1.9
def toggle
def toggle
"subsequent times"
end
"first time"
end
HTH!
Une grande différence serait le passage de l'interprète de Matz à YARV , une machine virtuelle à code bytec qui aide significativement les performances.
Beaucoup recommandent maintenant le langage de programmation Ruby sur la pioche - plus précisément, il contient tous les détails des différences 1.8 / 1.9.