ما الفرق بين روبي 1.8 وروبي 1.9؟
سؤال
لست واضحًا بشأن الاختلافات بين الإصدار "الحالي" من 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>
استخدام $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