سؤال

لست واضحًا بشأن الاختلافات بين الإصدار "الحالي" من Ruby (1.8) والإصدار "الجديد" (1.9).هل هناك تفسير "سهل" أو "بسيط" للاختلافات وسبب اختلافها؟

هل كانت مفيدة؟

المحلول

سام روبي لديه عرض شرائح رائع يوضح الاختلافات.

من أجل إدراج هذه المعلومات في السطر لتسهيل الرجوع إليها، وفي حالة توقف الارتباط في المستقبل المجرّد، إليك نظرة عامة على شرائح Sam.إن عرض الشرائح أقل إرهاقًا للمراجعة، ولكن من المفيد أيضًا وضع كل ذلك في قائمة مثل هذه.

روبي 1.9 - الميزات الرئيسية

  • أداء
  • المواضيع / الألياف
  • الترميز/يونيكود
  • الأحجار الكريمة (في الغالب) مدمجة الآن
  • إذا لم تقدم العبارات نطاقًا في روبي.

ما الذي تغير؟

سلاسل أحرف واحدة.

روبي 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

فعل: استخدم مفتاح التجزئة


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

(تابع) روبي 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

فعل: استخدم ::الرياضيات::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"

فعل: هل تريد استبدال example_methods.include؟مع الأسلوب_المحدد؟


ترميز الملف المصدر

أساسي

# coding: utf-8

ايماكس

# -*- 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

التعبير العادي "الخصائص"

روبي 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

هث!

نصائح أخرى

أحد الاختلافات الكبيرة هو الانتقال من مترجم ماتز إلى YARV, ، جهاز افتراضي للرمز الثانوي يساعد بشكل كبير في الأداء.

يوصي الكثير الآن لغة البرمجة روبي فوق الفأس - والأهم من ذلك، أنه يحتوي على جميع تفاصيل الاختلافات 1.8/1.9.

بعض التغييرات الإضافية:

إرجاع مصفوفة مفردة splat:

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"
  • روبي 1.9:طريقة غير محددة `كل' لـ "1":String
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top