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

===============>>#1 票数:170 已采纳

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

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

Ruby 1.9 - 主要功能

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

改变了什么?

单个字符串。

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

{“a”,“b”}不再支持

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}

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


Array.to_s现在包含标点符号

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"

操作:改用.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'

Ruby 1.8.6

irb(main):001:0> case 'a'; when /\w/: puts 'word'; end
word

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


块变量现在阴影局部变量

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已弃用

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

操作:使用Hash.key


Fixnum.to_sym现在已经Fixnum.to_sym

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

(续)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"}

订单是广告订单


更严格的Unicode正则表达式

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

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

packunpack pack

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

BasicObjectBlankSlate更残酷

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

操作:使用:: Math :: 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> 

缺陷17700


使用$ 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> {}.methods.sort.last
=> :zip

instance_methods现在是一个符号数组

Ruby 1.9

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

Ruby 1.8.6

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

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


源文件编码

基本

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

Emacs的

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

家当

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

真正的线程

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

什么是新的?

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

Ruby 1.9

 {a: b} redirect_to action: show 

Ruby 1.8.6

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

阻止局部变量

Ruby 1.9

[1,2].inject(:+)

注射方法

Ruby 1.9

 [1,2].inject(:+) 

Ruby 1.8.6

short_enum = [1, 2, 3].to_enum
long_enum = ('a'..'z').to_enum
loop do
  puts "#{short_enum.next} #{long_enum.next}"
end

to_enum

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]

Lambda速记

Ruby 1.9

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

Ruby 1.8.6

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.9

 /\\p{Space}/ 

Ruby 1.8.6

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

“嵌套”方法

Ruby 1.9

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

HTH!

===============>>#2 票数:12

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

===============>>#3 票数:4

许多人现在推荐使用 Pickaxe 的Ruby编程语言 - 更重要的是,它具有1.8 / 1.9差异的所有细节。

===============>>#4 票数:1

更多变化:

返回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”
  • ruby 1.9:未定义的方法`each'表示“1”:字符串

  ask by salt.racer translate from so

未解决问题?本站智能推荐: