102 votes

Quelle est la différence entre Ruby 1.8 et Ruby 1.9

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?

170voto

Tim Sullivan Points 10677

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>

Défaut 17700


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!

12voto

Sören Kuklau Points 9445

Une grande différence serait le passage de l'interprète de Matz à YARV , une machine virtuelle à code bytec qui aide significativement les performances.

4voto

Dave Everitt Points 3862

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.

1voto

Wim Yedema Points 1

Quelques autres changements:

Retourner un tableau splatch singleton:

 def function
  return *[1]
end

a=function
 
  • Ruby 1.9: [1]
  • rubis 1.8: 1

arguments de tableau

 def function(array)
  array.each { |v| p v }
end
function "1"
 
  • rubis 1.8: "1"
  • Ruby 1.9: méthode non définie `each 'pour" 1 ": String

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X