Сведения о вопросе

Ayrat

07:11, 9th August, 2020

Теги

ruby   ruby-1.9   ruby-1.8    

В чем разница между Ruby 1.8 и Ruby 1.9

Просмотров: 448   Ответов: 4

Я не совсем понимаю разницу между версией "current" Ruby (1.8) и версией "new" (1.9). Существует ли "easy" или "simple" объяснение этих различий и почему они так различны?



  Сведения об ответе

nYU

22:06, 7th August, 2020

У Sam Ruby есть классное слайд-шоу, которое описывает различия .

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

Ruby 1.9-Основные Характеристики

  • Спектакль
  • Нити / Волокна
  • Кодировка/Юникод
  • драгоценные камни (в основном) теперь встроены
  • если операторы не вводят область действия в Ruby.

Что же изменилось?

Одиночные символьные строки.

Ruby 1.9

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

Ruby 1.8.6

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

Строковый индекс.

Ruby 1.9

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

Ruby 1.8.6

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

{"a","b"} Больше Не Поддерживается

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}

Действие: преобразовать в {1 => 2}


Array.to_s Теперь Содержит Знаки Препинания

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"

Действие: вместо этого используйте .join


Колон Уже Не Действует, Когда Заявления

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

Действие: используйте точку с запятой, затем или новую строку


Блочные Переменные Теперь Теневые Локальные Переменные

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 устарело

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

Действие: Используйте Hash.key


Fixnum.to_sym Теперь Нет

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

(Продолжение) 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 Ключи Теперь Неупорядочены

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"}

Порядок-это порядок вставки


Более Строгие Регулярные Выражения Unicode

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 и Regexp теперь понимают 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 и 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 Более Жестокий, Чем 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

Действие: Использование:: Math::PI


Изменения В Делегировании

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>

Дефект 17700


  Сведения об ответе

LAST

00:16, 1st August, 2020

Одним из огромных отличий будет переход от интерпретатора Matz к YARV, виртуальной машине байт-кода, которая значительно повышает производительность.


  Сведения об ответе

9090

13:42, 8th August, 2020

Многие теперь рекомендуют язык программирования Ruby поверх кирки - более того, он имеет все детали различий 1.8/1.9.


  Сведения об ответе

LAST

06:17, 29th August, 2020

Еще несколько изменений:

Возврат массива splat singleton:

def function
  return *[1]
end

a=function
  • ruby 1.9 : [1]
  • ruby 1.8 : 1

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

def function(array)
  array.each { |v| p v }
end
function "1"
  • ruby 1.8: "1"
  • ruby 1.9: неопределенный метод 'each' для "1": String


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться