Яка різниця між Ruby 1.8 та Ruby 1.9


102

Мені не зрозуміло, чим відрізняються "поточна" версія Ruby (1.8) та "нова" версія (1.9). Чи є "легке" чи "просте" пояснення відмінностей і чому вони такі різні?


1
Я припускаю, що ви маєте на увазі Ruby 1.8.6 - Ruby 1.8.7 має багато бібліотечних конструкцій з 1.9.
Ендрю Грімм

Ще я вважаю версії 1.8 "старими" версіями, а 1.9.2+ - "поточними". Я використовую лише 1.8.7 для перевірки сумісності, але розвиваюсь в 1.9.2.
Олов'яний чоловік

5
@Telemachus: посилання зламана.
Ендрю Грімм

1
@ Telemachus, Andrew Grimm - це посилання archive.org працює - web.archive.org/web/20090423003136/http://eigenclass.org/…
J.Merrill

Відповіді:


170

Сем Рубі має круте слайд-шоу, яке окреслює відмінності .

В інтересах залучення цієї інформації для легшого ознайомлення, і якщо посилання в абстрактному майбутньому перерветься, ось огляд слайдів Сема. Слайд-шоу менш захоплююче для перегляду, але також все це викладено у такому списку.

Ruby 1.9 - Основні характеристики

  • Продуктивність
  • Нитки / волокна
  • Кодування / Unicode
  • дорогоцінні камені зараз (в основному) вбудовані
  • якщо заяви не вводять сферу застосування в Ruby.

Що змінилося?

Одиночні символьні рядки.

Рубін 1.9

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

Рубін 1.8.6

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

Індекс рядків

Рубін 1.9

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

Рубін 1.8.6

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

{"a", "b"} Більше не підтримується

Рубін 1.9

irb(main):002:0> {1,2}
SyntaxError: (irb):2: syntax error, unexpected ',', expecting tASSOC

Рубін 1.8.6

irb(main):001:0> {1,2}
=> {1=>2}

Дія: Перетворити на {1 => 2}


Array.to_s Тепер містить розділові знаки

Рубін 1.9

irb(main):001:0> [1,2,3].to_s
=> "[1, 2, 3]"

Рубін 1.8.6

irb(main):001:0> [1,2,3].to_s
=> "123"

Дія: Замість цього використовуйте .join


Товста кишка більше не діє

Рубін 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'

Рубін 1.8.6

irb(main):001:0> case 'a'; when /\w/: puts 'word'; end
word

Дія: Використовуйте крапку з комою, потім або новий рядок


Блокувати змінні тепер затініть локальні змінні

Рубін 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

Рубін 1.8.6

irb(main):001:0> i=0; [1,2,3].each {|i|}; i
=> 3

Hash.index Застарілий

Рубін 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

Рубін 1.8.6

irb(main):001:0> {1=>2}.index(2)
=> 1

Дія: Використовуйте Hash.key


Fixnum.to_sym Тепер пішло

Рубін 1.9

irb(main):001:0> 5.to_sym
NoMethodError: undefined method 'to_sym' for 5:Fixnum

Рубін 1.8.6

irb(main):001:0> 5.to_sym
=> nil

(Продовження) 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


Ключі хешу зараз не упорядковані

Рубін 1.9

irb(main):001:0> {:a=>"a", :c=>"c", :b=>"b"}
=> {:a=>"a", :c=>"c", :b=>"b"}

Рубін 1.8.6

irb(main):001:0> {:a=>"a", :c=>"c", :b=>"b"}
=> {:a=>"a", :b=>"b", :c=>"c"}

Замовлення - це порядок вставки


Строгіші регулярні вирази Unicode

Рубін 1.9

irb(main):001:0> /\x80/u
SyntaxError: (irb):2: invalid multibyte escape: /\x80/

Рубін 1.8.6

irb(main):001:0> /\x80/u
=> /\x80/u

trі Regexpтепер зрозумійте Unicode

Рубін 1.9

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

pack і unpack

Рубін 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 Більш жорстокий, ніж BlankSlate

Рубін 1.9

irb(main):001:0> class C < BasicObject; def f; Math::PI; end; end; C.new.f
NameError: uninitialized constant C::Math

Рубін 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

Дія: Використовуйте :: Math :: PI


Зміни делегації

Рубін 1.9

irb(main):002:0> class C < SimpleDelegator; end
=> nil
irb(main):003:0> C.new('').class
=> String

Рубін 1.8.6

irb(main):002:0> class C < SimpleDelegator; end
=> nil
irb(main):003:0> C.new('').class
=> C
irb(main):004:0>

Дефект 17700


Використання $ KCODE створює попередження

Рубін 1.9

irb(main):004:1> $KCODE = 'UTF8'
(irb):4: warning: variable $KCODE is no longer effective; ignored
=> "UTF8"

Рубін 1.8.6

irb(main):001:0> $KCODE = 'UTF8'
=> "UTF8"

instance_methods Тепер масив символів

Рубін 1.9

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

Рубін 1.8.6

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

Дія: Замініть instance_methods.include? з методом_визначення?


Кодування вихідного файлу

Основні

# coding: utf-8

Emacs

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

Шебанг

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

Справжня нитка

  • Умови гонки
  • Неявні припущення щодо впорядкування
  • Код тесту

Що нового?

Чергуйте синтаксис символу як клавіші хешу

Рубін 1.9

{a: b}

redirect_to action: show

Рубін 1.8.6

{:a => b}

redirect_to :action => show

Блокувати локальні змінні

Рубін 1.9

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

Методи ін’єкцій

Рубін 1.9

[1,2].inject(:+)

Рубін 1.8.6

[1,2].inject {|a,b| a+b}

to_enum

Рубін 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

Немає блоку? Енум!

Рубін 1.9

e = [1,2,3].each

Ламбда-скоромовка

Рубін 1.9

p = -> a,b,c {a+b+c}
puts p.(1,2,3)
puts p[1,2,3]

Рубін 1.8.6

p = lambda {|a,b,c| a+b+c}
puts p.call(1,2,3)

Складні числа

Рубін 1.9

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

Десяткові числа все ще не є типовими

Рубін 1.9

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

Regex "Властивості"

Рубін 1.9

/\p{Space}/

Рубін 1.8.6

/[:space:]/

Бризок посередині

Рубін 1.9

def foo(first, *middle, last)

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

Волокна

Рубін 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}

Розбийте цінності

Рубін 1.9

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

"Вкладені" методи

Рубін 1.9

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

HTH!


3
HTH == "Сподіваюсь, що допомагає". Мені довелося це подивитися. Чи можете ви вказати мені на надану вами відповідь, де ви не сподівалися, що це допоможе?
Кріс Вессілінг

Або ти мав на увазі Щасливий допомогти? Будь ласка, відредагуйте відповідно. Або видаліть його, якщо ваше щастя / сподівання враховує всі ваші відповіді. ;-)
Кріс Вессілінг

10
Ні, я збираюся залишити його таким, яким він є. Як відсоток від загальної відповіді, це незначно, і будь-яке тлумачення зі мною добре. Дякую.
Тім Салліван

Відповідно до наданого вами посилання, зміна делегації виявила помилку та її виправлено.
Кайл Странд

Як щодо невідповідності між "Range.include?" метод? Ruby v1.8.7 дає інший результат, ніж v1.9
Лукас Поттерський

12

Однією величезною різницею було б перехід від інтерпретатора Маца до YARV , віртуальної машини з байт- кодом , яка значно допомагає в продуктивності.


4

Зараз багато хто рекомендує мову програмування Ruby на Pickaxe - до речі, у ньому є всі деталі різниці 1,8 / 1,9.


1
Мені вони обоє подобаються. У книзі Pickaxe більш детально обговорюються деякі речі, але мова програмування Ruby хороша, коли ви хочете швидко щось пошукати. Це ближче до "горішкової" книги.
Олов'яний чоловік

1

Ще кілька змін:

Повернення масиву splat singleton:

def function
  return *[1]
end

a=function
  • рубін 1,9: [1]
  • рубін 1,8: 1

аргументи масиву

def function(array)
  array.each { |v| p v }
end
function "1"
  • рубін 1,8: "1"
  • ruby 1.9: невизначений метод `every 'для" 1 ": String
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.