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?
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?
Câu trả lời:
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
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
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âuRuby 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ế
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
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ậnRuby 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 GoneRuby 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
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
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
và Regexp
Bây giờ hiểu UnicodeRuby 1.9
unicode(string).tr(CP1252_DIFFERENCES, UNICODE_EQUIVALENT).
gsub(INVALID_XML_CHAR, REPLACEMENT_CHAR).
gsub(XML_PREDEFINED) {|c| PREDEFINED[c.ord]}
pack
và 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
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
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>
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ượngRuby 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?
# coding: utf-8
# -*- encoding: utf-8 -*-
#!/usr/local/rubybook/bin/ruby
# encoding: utf-8
Ruby 1.9
{a: b}
redirect_to action: show
Ruby 1.8.6
{:a => b}
redirect_to :action => show
Ruby 1.9
[1,2].each {|value; t| t=value*value}
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
Ruby 1.9
e = [1,2,3].each
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)
Ruby 1.9
Complex(3,4) == 3 + 4.im
Ruby 1.9
irb(main):001:0> 1.2-1.1
=> 0.0999999999999999
Ruby 1.9
/\p{Space}/
Ruby 1.8.6
/[:space:]/
Ruby 1.9
def foo(first, *middle, last)
(->a, *b, c {p a-c}).(*5.downto(1))
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}
Ruby 1.9
match =
while line = gets
next if line =~ /^#/
break line if line.find('ruby')
end
Ruby 1.9
def toggle
def toggle
"subsequent times"
end
"first time"
end
HTH!
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.
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.
Một số thay đổi khác:
Trả về một mảng singleton splat:
def function
return *[1]
end
a=function
đối số mảng
def function(array)
array.each { |v| p v }
end
function "1"