我不清楚“当前”版本的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

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

3回复

Ruby 1.8和Ruby 1.9中“Array#to_s”的区别[重复]

可能重复: Ruby 1.9 Array.to_s的行为有何不同? 我想知道是否有人能告诉我Ruby 1.8.7和Ruby 1.9.3之间的变化。 我有一个下面列出的示例,在2个版本中表现完全不同,但根据Ruby文档,它们在这些版本之间似乎没有任何变化。 Ruby 1.8
1回复

列表元素比较中Ruby 1.8与1.9之间的区别

这两个Ruby版本分别是:1.8.7(学校使用)和1.9.3(当前版本,我在系统上拥有)。 只是好奇1.9.3的不同之处,使以下内容无法正常工作。 如果列表中的所有元素都相同,则该函数输出true如果不完全相同,则输出false 。 在Ruby 1.9.4中, 而在Rub
2回复

如何从Ruby 1.9调用/需要Ruby 1.8 Lib

我正在使用Ruby 1.8 lib kakasi-ruby ,但它似乎只能针对Ruby 1.8进行编译(https://github.com/hogelog/kakasi-ruby/issues/2) 我的应用程序是Ruby 1.9.3,所以我需要从Ruby 1.9.3调用kakasi-r
1回复

为什么这个代码不是在ruby 1.9上编译,而是在ruby 1.8上?

抱歉标题,我不知道如何调用这种语法。 例如: Ruby 1.8 Ruby 1.9 ※ 我不是要求获得通缉阵列的方法。 我想知道为什么这段代码工作是Ruby的版本之一,但不是两者兼而有之 。
1回复

将红宝石1.8编码转换为红宝石1.9

如何将以下不推荐使用的ruby 1.8代码转换为ruby 1.9代码? 谢谢。
1回复

为什么这段代码适用于ruby 1.8而不是ruby 1.9?

这段代码: 在Ruby 1.8.7中解析没有错误,但返回语法错误: 在Ruby> = 1.9。 我查看了Ruby 1.8和Ruby 1.9之间的区别 ,但找不到对此的引用。 有谁知道造成这种变化的原因是什么?
4回复

在Ruby 1.8和1.9中使用相同的代码处理字符串编码

我有一个宝石 ,它使用了很多人使用一堆不同的Ruby解释器,并且其中包括以下代码: res的内容始终为UTF-8,在Ruby 1.8中可以正常工作,但是如果响应不是纯ASCII 且用户的默认编码不是UTF-8,则在Ruby 1.9下会崩溃。 现在,如果我想仅在Ruby 1.9上进行
1回复

在Ruby 1.9中使用eval()测试Ruby代码片段

我想在Ruby 1.9中使用eval()以交互方式测试小块ruby代码。 很久以前(在Ruby 1.4附近)我在互联网上找到了一个提供此功能的简洁脚本。 这是简化版和简化版: 我能做的事情如下: 这个脚本适用于Ruby 1.8,但由于eval()语义已经改变,因此在1.9中不
6回复

什么令人沮丧,你写的特定于ruby 1.9的代码? [关闭]

到目前为止,我一直只使用YARV(ruby 1.9)作为ruby比ruby 1.8更快的实现,并确保我的所有代码都向后兼容ruby 1.8.6。 什么情况,如果有的话,阻止你编写特定于1.9的代码? 每个答案的一个原因。
2回复

在ruby 1.8中等效于String#setbyte和String#getbyte

试图让Aerospike红宝石客户端在1.8以下工作 在ruby 1.8中,这些调用的等效条件是什么? https://github.com/aerospike/aerospike-client-ruby/blob/master/lib/aerospike/utils/buffer.