ความแตกต่างระหว่าง Ruby 1.8 และ Ruby 1.9 คืออะไร


102

ฉันไม่ชัดเจนเกี่ยวกับความแตกต่างระหว่างเวอร์ชัน "ปัจจุบัน" ของ Ruby (1.8) และเวอร์ชัน "ใหม่" (1.9) มีคำอธิบาย "ง่าย" หรือ "ธรรมดา" เกี่ยวกับความแตกต่างและเหตุใดจึงแตกต่างกัน


1
ฉันคิดว่าคุณหมายถึง Ruby 1.8.6 - Ruby 1.8.7 มีโครงสร้างห้องสมุดมากมายตั้งแต่ 1.9
Andrew Grimm

อีกต่อไปฉันคิดว่าเวอร์ชัน 1.8 เป็นเวอร์ชัน "เก่า" และ 1.9.2+ เวอร์ชัน "ปัจจุบัน" ฉันใช้ 1.8.7 สำหรับการตรวจสอบความเข้ากันได้เท่านั้น แต่พัฒนาใน 1.9.2
The Tin Man

5
@Telemachus: ลิงค์เสีย
Andrew Grimm

1
@Telemachus, Andrew Grimm - ลิงก์ archive.org นี้ใช้งานได้ - web.archive.org/web/20090423003136/http://eigenclass.org/…
J. Merrill

คำตอบ:


170

แซมทับทิมมีเย็นสไลด์โชว์โครงร่างที่แตกต่าง

เพื่อความสนใจในการนำข้อมูลนี้เข้ามาในบรรทัดเพื่อการอ้างอิงที่ง่ายขึ้นและในกรณีที่ลิงก์หยุดทำงานในอนาคตที่เป็นนามธรรมนี่คือภาพรวมของสไลด์ของ Sam สไลด์โชว์มีน้อยกว่าที่จะตรวจสอบ แต่การจัดวางทั้งหมดไว้ในรายการเช่นนี้ก็มีประโยชน์เช่นกัน

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"

การดำเนินการ:ใช้. เข้าร่วมแทน


โคลอนไม่สามารถใช้ได้อีกต่อไปในเมื่องบ

รูบี้ 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

การดำเนินการ:ใช้อัฒภาคแล้วขึ้นบรรทัดใหม่


ตัวแปรบล็อกตอนนี้ Shadow Local Variables

รูบี้ 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? ด้วย method_defined?


การเข้ารหัสไฟล์ต้นฉบับ

ขั้นพื้นฐาน

# coding: utf-8

Emacs

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

Shebang

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

เธรดจริง

  • เงื่อนไขการแข่งขัน
  • สมมติฐานการสั่งซื้อโดยปริยาย
  • รหัสทดสอบ

มีอะไรใหม่

ไวยากรณ์สำรองสำหรับ Symbol เป็น Hash Keys

รูบี้ 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:]/

Splat อยู่ตรงกลาง

รูบี้ 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

เฮ้!


3
HTH == "หวังว่าจะช่วยได้" ฉันต้องมองขึ้นไป คุณช่วยชี้คำตอบที่คุณให้มาโดยที่คุณไม่ได้หวังว่ามันจะช่วยได้
Chris Wesseling

หรือคุณหมายถึงยินดีที่จะช่วย? โปรดแก้ไขตาม หรือลบออกหากความสุข / ความหวังของคุณมีค่าสำหรับคำตอบทั้งหมดของคุณ ;-)
Chris Wesseling

10
ไม่ฉันจะปล่อยให้มันเป็นอย่างนั้น เป็นเปอร์เซ็นต์ของคำตอบทั้งหมดมันเป็นเรื่องเล็กและการตีความก็ใช้ได้กับฉัน ขอบคุณ.
Tim Sullivan

ตามลิงค์ที่คุณให้มาการเปลี่ยนแปลงในการมอบสิทธิ์เป็นข้อบกพร่องและได้รับการแก้ไขแล้ว
Kyle Strand

อะไรคือความไม่สอดคล้องกันระหว่าง "Range.include" วิธี? Ruby v1.8.7 ให้ผลลัพธ์ที่แตกต่างจาก v1.9
Lucas Pottersky

12

ความแตกต่างอย่างมากอย่างหนึ่งคือการย้ายจากล่ามของ Matz ไปเป็นYARVซึ่งเป็นเครื่องเสมือนแบบ bytecode ที่ช่วยเรื่องประสิทธิภาพได้อย่างมาก


4

ตอนนี้หลายคนแนะนำภาษาการเขียนโปรแกรม Rubyมากกว่า Pickaxe - ยิ่งไปกว่านั้นมันมีรายละเอียดทั้งหมดของความแตกต่าง 1.8 / 1.9


1
ฉันชอบทั้งคู่ หนังสือ Pickaxe กล่าวถึงบางสิ่งอย่างครบถ้วนมากกว่า แต่ภาษาโปรแกรม Ruby นั้นดีเมื่อคุณต้องการสแกนหาบางสิ่งอย่างรวดเร็ว ใกล้เคียงกับหนังสือ "สรุปสั้น ๆ " มากกว่า
The Tin Man

1

การเปลี่ยนแปลงเพิ่มเติม:

การส่งคืนอาร์เรย์แบบแยกเดี่ยว:

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: วิธีการที่ไม่ได้กำหนด `each 'สำหรับ" 1 ": String
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.