Sự khác biệt giữa Ruby 1.8 và Ruby 1.9 là gì


102

Tôi không rõ sự khác biệt giữa phiên bản "hiện tại" của Ruby (1.8) và phiên bản "mới" (1.9). Có một lời giải thích "dễ dàng" hay "đơn giản" về sự khác biệt và tại sao nó lại khác nhau như vậy?


1
Tôi giả sử ý bạn là Ruby 1.8.6 - Ruby 1.8.7 có rất nhiều cấu trúc thư viện từ 1.9.
Andrew Grimm

Thêm nữa, tôi coi các phiên bản 1.8 là phiên bản "cũ" và 1.9.2+ là phiên bản "hiện tại". Tôi chỉ sử dụng 1.8.7 để kiểm tra tính tương thích nhưng phát triển trong 1.9.2.
Tin Man

5
@Telemachus: Liên kết bị hỏng.
Andrew Grimm

1
@Telemachus, Andrew Grimm - Liên kết archive.org này công trình - web.archive.org/web/20090423003136/http://eigenclass.org/...
J.Merrill

Câu trả lời:


170

Sam Ruby có một trình chiếu thú vị phác thảo sự khác biệt .

Vì lợi ích của việc đưa thông tin này vào dòng để tham khảo dễ dàng hơn và trong trường hợp liên kết bị chết trong tương lai trừu tượng, đây là tổng quan về các trang trình bày của Sam. Việc xem lại bản trình chiếu sẽ ít gây choáng ngợp hơn, nhưng việc trình bày tất cả trong một danh sách như thế này cũng rất hữu ích.

Ruby 1.9 - Các tính năng chính

  • Hiệu suất
  • Chủ đề / sợi
  • Mã hóa / Unicode
  • gems (hầu hết) hiện được tích hợp sẵn
  • if các câu lệnh không giới thiệu phạm vi trong Ruby.

Có gì thay đổi?

Chuỗi ký tự đơn.

Ruby 1.9

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

Ruby 1.8.6

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

Chỉ số chuỗi.

Ruby 1.9

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

Ruby 1.8.6

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

{"a", "b"} Không còn được hỗ trợ

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}

Hành động: Chuyển đổi thành {1 => 2}


Array.to_s Hiện có dấu câu

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"

Hành động: Sử dụng .join thay thế


Dấu hai chấm không còn giá trị trong khi tuyên bố

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

Hành động: Sử dụng dấu chấm phẩy, sau đó hoặc dòng mới


Chặn biến ngay bây giờ đổ bóng biến cục bộ

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 Không được chấp nhận

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

Hành động: Sử dụng Hash.key


Fixnum.to_sym Now Gone

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

(Tiếp) 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


Các phím băm bây giờ không có thứ tự

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

Thứ tự là thứ tự chèn


Biểu thức chính quy Unicode chặt chẽ hơn

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

trRegexpBây giờ hiểu Unicode

Ruby 1.9

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

packunpack

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 Tàn bạo hơn 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

Hành động: Sử dụng :: Toán học :: PI


Thay đổi ủy quyền

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>

Khuyết điểm 17700


Sử dụng các Cảnh báo Sản xuất $ KCODE

Ruby 1.9

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

Ruby 1.8.6

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

instance_methods Bây giờ là một mảng biểu tượng

Ruby 1.9

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

Ruby 1.8.6

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

Hành động: Thay thế instance_methods.include? với method_defined?


Mã hóa tệp nguồn

Căn bản

# coding: utf-8

Emacs

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

Shebang

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

Phân luồng thực

  • Điều kiện cuộc đua
  • Các giả định về đặt hàng ngầm
  • Mã kiểm tra

Có gì mới?

Cú pháp thay thế cho biểu tượng dưới dạng các phím băm

Ruby 1.9

{a: b}

redirect_to action: show

Ruby 1.8.6

{:a => b}

redirect_to :action => show

Chặn biến cục bộ

Ruby 1.9

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

Phương pháp tiêm

Ruby 1.9

[1,2].inject(:+)

Ruby 1.8.6

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

to_enum

Ruby 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

Không có khối? Enum!

Ruby 1.9

e = [1,2,3].each

Lambda tốc ký

Ruby 1.9

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

Ruby 1.8.6

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

Số phức

Ruby 1.9

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

Số thập phân vẫn không phải là mặc định

Ruby 1.9

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

Regex "Thuộc tính"

Ruby 1.9

/\p{Space}/

Ruby 1.8.6

/[:space:]/

Splat ở giữa

Ruby 1.9

def foo(first, *middle, last)

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

Sợi

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

Phá vỡ giá trị

Ruby 1.9

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

Phương thức "lồng nhau"

Ruby 1.9

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

HTH!


3
HTH == "Hy vọng rằng sẽ giúp". Tôi đã phải tra cứu điều đó. Bạn có thể chỉ cho tôi một câu trả lời mà bạn đã cung cấp, nơi bạn không hy vọng rằng nó sẽ hữu ích không?
Chris Wesseling

Hay ý bạn là Hạnh phúc khi được giúp đỡ? Vui lòng chỉnh sửa cho phù hợp. Hoặc loại bỏ nó, nếu hạnh phúc / hy vọng của bạn được tính cho tất cả các câu trả lời của bạn. ;-)
Chris Wesseling

10
Không, tôi sẽ để nguyên như vậy. Theo một tỷ lệ phần trăm của tổng số câu trả lời, nó rất nhỏ và với tôi thì cả hai cách giải thích đều ổn. Cảm ơn.
Tim Sullivan

Theo liên kết bạn cung cấp, thay đổi ủy quyền là một lỗi và đã được sửa.
Kyle Strand

Còn về sự không nhất quán giữa "Range.include?" phương pháp? Ruby v1.8.7 đưa ra một kết quả khác nhau hơn so với v1.9
Lucas Pottersky

12

Một sự khác biệt lớn là việc chuyển từ trình thông dịch của Matz sang YARV , một máy ảo bytecode giúp hỗ trợ đáng kể hiệu suất.


4

Nhiều người hiện đang giới thiệu Ngôn ngữ lập trình Ruby thay vì Pickaxe - hơn nữa, nó có tất cả các chi tiết về sự khác biệt 1.8 / 1.9.


1
Tôi thích cả hai. Cuốn sách Pickaxe thảo luận về một số thứ đầy đủ hơn nhưng Ngôn ngữ lập trình Ruby rất tốt khi bạn muốn quét nhanh một thứ gì đó. Nó gần giống với một cuốn sách "tóm tắt".
the Tin Man

1

Một số thay đổi khác:

Trả về một mảng singleton splat:

def function
  return *[1]
end

a=function
  • ruby 1,9: [1]
  • ruby 1,8: 1

đối số mảng

def function(array)
  array.each { |v| p v }
end
function "1"
  • ruby 1,8: "1"
  • ruby 1.9: phương thức không xác định `mỗi 'cho" 1 ": Chuỗi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.