Ruby 1.8和Ruby 1.9有什么区别

sal*_*cer 102 ruby ruby-1.9 ruby-1.8

我不清楚"当前"版本的Ruby(1.8)和"新"版本(1.9)之间的差异.是否存在对这些差异的"简单"或"简单"解释以及为何如此不同?

Tim*_*van 170

Sam Ruby有一个很酷的幻灯片,概述了差异.

为了便于参考这些信息,如果链接在抽象的未来失效,这里是对Sam的幻灯片的概述.幻灯片放映的评论不那么令人难以置信,但是将它们全部列在这样的列表中也很有帮助.

Ruby 1.9 - 主要功能

  • 性能
  • 线程/纤维
  • 编码/ Unicode的
  • 宝石现在(大部分)是内置的
  • if语句没有在Ruby中引入范围.

改变了什么?

单个字符串.

Ruby 1.9

irb(main):001:0> ?c
=> "c"
Run Code Online (Sandbox Code Playgroud)

Ruby 1.8.6

irb(main):001:0> ?c
=> 99
Run Code Online (Sandbox Code Playgroud)

字符串索引.

Ruby 1.9

irb(main):001:0> "cat"[1]
=> "a"
Run Code Online (Sandbox Code Playgroud)

Ruby 1.8.6

irb(main):001:0> "cat"[1]
=> 97
Run Code Online (Sandbox Code Playgroud)

{"a","b"}不再支持

Ruby 1.9

irb(main):002:0> {1,2}
SyntaxError: (irb):2: syntax error, unexpected ',', expecting tASSOC
Run Code Online (Sandbox Code Playgroud)

Ruby 1.8.6

irb(main):001:0> {1,2}
=> {1=>2}
Run Code Online (Sandbox Code Playgroud)

行动:转换为{1 => 2}


Array.to_s 现在包含标点符号

Ruby 1.9

irb(main):001:0> [1,2,3].to_s
=> "[1, 2, 3]"
Run Code Online (Sandbox Code Playgroud)

Ruby 1.8.6

irb(main):001:0> [1,2,3].to_s
=> "123"
Run Code Online (Sandbox Code Playgroud)

操作:改用.join


结语在声明时不再有效

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'
Run Code Online (Sandbox Code Playgroud)

Ruby 1.8.6

irb(main):001:0> case 'a'; when /\w/: puts 'word'; end
word
Run Code Online (Sandbox Code Playgroud)

操作:使用分号,然后使用分号或换行符


块变量现在阴影局部变量

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
Run Code Online (Sandbox Code Playgroud)

Ruby 1.8.6

irb(main):001:0> i=0; [1,2,3].each {|i|}; i
=> 3
Run Code Online (Sandbox Code Playgroud)

Hash.index 弃用

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
Run Code Online (Sandbox Code Playgroud)

Ruby 1.8.6

irb(main):001:0> {1=>2}.index(2)
=> 1
Run Code Online (Sandbox Code Playgroud)

操作:使用Hash.key


Fixnum.to_sym 现在走了

Ruby 1.9

irb(main):001:0> 5.to_sym
NoMethodError: undefined method 'to_sym' for 5:Fixnum
Run Code Online (Sandbox Code Playgroud)

Ruby 1.8.6

irb(main):001:0> 5.to_sym
=> nil
Run Code Online (Sandbox Code Playgroud)

(续)Ruby 1.9

# Find an argument value by name or index.
def [](index)
  lookup(index.to_sym)
end
Run Code Online (Sandbox Code Playgroud)

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"}
Run Code Online (Sandbox Code Playgroud)

Ruby 1.8.6

irb(main):001:0> {:a=>"a", :c=>"c", :b=>"b"}
=> {:a=>"a", :b=>"b", :c=>"c"}
Run Code Online (Sandbox Code Playgroud)

订单是广告订单


更严格的Unicode正则表达式

Ruby 1.9

irb(main):001:0> /\x80/u
SyntaxError: (irb):2: invalid multibyte escape: /\x80/
Run Code Online (Sandbox Code Playgroud)

Ruby 1.8.6

irb(main):001:0> /\x80/u
=> /\x80/u
Run Code Online (Sandbox Code Playgroud)

trRegexp现在明白的Unicode

Ruby 1.9

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

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
Run Code Online (Sandbox Code Playgroud)

BasicObject 比野蛮更残酷 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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

操作:使用:: Math :: PI


授权变更

Ruby 1.9

irb(main):002:0> class C < SimpleDelegator; end
=> nil
irb(main):003:0> C.new('').class
=> String
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

缺陷17700


使用$ KCODE生成警告

Ruby 1.9

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

Ruby 1.8.6

irb(main):001:0> $KCODE = 'UTF8'
=> "UTF8"
Run Code Online (Sandbox Code Playgroud)

instance_methods 现在是一个符号数组

Ruby 1.9

irb(main):001:0> {}.methods.sort.last
=> :zip
Run Code Online (Sandbox Code Playgroud)

Ruby 1.8.6

irb(main):001:0> {}.methods.sort.last
=> "zip"
Run Code Online (Sandbox Code Playgroud)

操作:替换instance_methods.include?使用method_defined?


源文件编码

基本

# coding: utf-8
Run Code Online (Sandbox Code Playgroud)

Emacs的

# -*- encoding: utf-8 -*-
Run Code Online (Sandbox Code Playgroud)

家当

#!/usr/local/rubybook/bin/ruby
# encoding: utf-8
Run Code Online (Sandbox Code Playgroud)

真正的线程

  • 比赛条件
  • 隐式排序假设
  • 测试代码

什么是新的?

符号的备用语法作为哈希键

Ruby 1.9

{a: b}

redirect_to action: show
Run Code Online (Sandbox Code Playgroud)

Ruby 1.8.6

{:a => b}

redirect_to :action => show
Run Code Online (Sandbox Code Playgroud)

阻止局部变量

Ruby 1.9

[1,2].each {|value; t| t=value*value}
Run Code Online (Sandbox Code Playgroud)

注射方法

Ruby 1.9

[1,2].inject(:+)
Run Code Online (Sandbox Code Playgroud)

Ruby 1.8.6

[1,2].inject {|a,b| a+b}
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

没块?枚举!

Ruby 1.9

e = [1,2,3].each
Run Code Online (Sandbox Code Playgroud)

Lambda速记

Ruby 1.9

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

Ruby 1.8.6

p = lambda {|a,b,c| a+b+c}
puts p.call(1,2,3)
Run Code Online (Sandbox Code Playgroud)

复数

Ruby 1.9

Complex(3,4) == 3 + 4.im
Run Code Online (Sandbox Code Playgroud)

十进制仍然不是默认值

Ruby 1.9

irb(main):001:0> 1.2-1.1
=> 0.0999999999999999
Run Code Online (Sandbox Code Playgroud)

正则表达"属性"

Ruby 1.9

/\p{Space}/
Run Code Online (Sandbox Code Playgroud)

Ruby 1.8.6

/[:space:]/
Run Code Online (Sandbox Code Playgroud)

在中间摔跤

Ruby 1.9

def foo(first, *middle, last)

(->a, *b, c {p a-c}).(*5.downto(1))
Run Code Online (Sandbox Code Playgroud)

纤维

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}
Run Code Online (Sandbox Code Playgroud)

打破价值观

Ruby 1.9

match =
   while line = gets
     next if line =~ /^#/
     break line if line.find('ruby')
   end
Run Code Online (Sandbox Code Playgroud)

"嵌套"方法

Ruby 1.9

def toggle
  def toggle
    "subsequent times"
  end
  "first time"
end
Run Code Online (Sandbox Code Playgroud)

HTH!

  • 不,我会按原样离开.作为总答案的百分比,它是微不足道的,任何一种解释都适合我.谢谢. (10认同)
  • HTH =="希望有所帮助".我不得不抬头看.你能指点一下你提供的答案吗?你不希望这会有所帮助吗? (3认同)

Sör*_*lau 12

一个巨大的差异将是从Matz的解释器转移到YARV,YARV是一个字节码虚拟机,可以显着提高性能.