ruby1.8到1.9 的改变

改进:
执行效率
Threads/Fibers
Encoding/Unicode
gems is (mostly) built-in now

  
Single character strings.
1
2
3
4
5
6
7
8
Ruby 1 . 9
   
  irb(main): 001 : 0 > "cat" [ 1 ]
  => "a"
  Ruby 1 . 8 . 6
   
  irb(main): 001 : 0 > "cat" [ 1 ]
  => 97

String index.
1
2
3
4
5
6
7
8
Ruby 1 . 9
   
  irb(main): 001 : 0 > "cat" [ 1 ]
  => "a"
  Ruby 1 . 8 . 6
   
  irb(main): 001 : 0 > "cat" [ 1 ]
  => 97

{"a","b"} 写法不再支持
1
2
3
4
5
6
7
8
9
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 }
  Action: Convert to { 1 => 2 }

  
Array.to_s 现在包含逗号了.
  
1
2
3
4
5
6
7
8
9
Ruby 1 . 9
  irb(main): 001 : 0 >p [ 1 , 2 , 3 ]
  => "[1, 2, 3]"
   
  Ruby 1 . 8 . 6
   
  irb(main): 001 : 0 >p [ 1 , 2 , 3 ]
  => "123"
  Action: Use [ 1 , 2 , 3 ].join instead

  when 条件 :冒号不再支持
1
2
3
4
5
6
7
8
9
10
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
  Action: 使用分号或换新行

  
语句块里的变量是局部变量。
1
2
3
4
5
6
7
8
9
10
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 方法过时了,会出警告
1
2
3
4
5
6
7
8
9
10
11
12
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
  Action: 使用 Hash .key

Fixnum.to_sym 方法没了,会出Error
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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
  (Cont'd) 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

Hash的.Keys 现在是有序的。
1
2
3
4
5
6
7
8
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" }
  有序 :a :b :c

更严格的Unicode正则表达式  
1
2
3
4
5
6
7
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 和 Regexp 现在支持 Unicode
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Ruby 1 . 9
  unicode(string).tr( CP1252_DIFFERENCES , UNICODE_EQUIVALENT ).
    gsub( INVALID_XML_CHAR , REPLACEMENT_CHAR ).
    gsub( XML_PREDEFINED ) {|c| PREDEFINED [c.ord]}
  pack and 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 比 BlankSlate 牛B了
1
2
3
4
5
6
7
8
9
10
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
  Action: Use ::Math:: PI

Delegation 改变
1
2
3
4
5
6
7
8
9
10
11
12
13
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 >

Defect 17700
  
使用 $KCODE 会出警告
1
2
3
4
5
6
7
8
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"

内置方法名改成Symble,以前是String
1
2
3
4
5
6
7
8
Ruby 1 . 9
  irb(main): 001 : 0 > {}.methods.sort.last
  => :zip
   
  Ruby 1 . 8 . 6
  irb(main): 001 : 0 > {}.methods.sort[- 1 ]
  => "zip"
  Action: 用 method_defined?替代instance_methods.include?

源文件编码

1
2
3
4
5
6
7
8
9
Basic
  # coding: utf-8
   
  Emacs
  # -*- encoding: utf-8 -*-
   
  Shebang
  #!/usr/local/rubybook/bin/ruby
  # encoding: utf-8

  
系统级别的真正线程,1.8是ruby自己模拟的线程
1
2
3
Race Conditions
  Implicit Ordering Assumptions
  Test Code

新特性
Hash的Keys支持符号
1
2
3
4
5
6
7
8
9
10
Ruby 1 . 9
   
  {a: b}
   
  redirect_to action: show
  Ruby 1 . 8 . 6
   
  { :a => b}
   
  redirect_to :action => show

代码块内局部变量
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Ruby 1 . 9
   
  [ 1 , 2 ]. each {|value; t| t=value*value}
  Inject Methods
   
  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

  
可以省略{}块
1
2
3
Ruby 1 . 9
   
  e = [ 1 , 2 , 3 ]. each

  
Lambda 简写  
1
2
3
4
5
6
7
8
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 )

  
复数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Ruby 1 . 9
   
  Complex( 3 , 4 ) == 3 + 4 .im
  Decimal Is Still Not The Default
   
  Ruby 1 . 9
   
  irb(main): 001 : 0 > 1 . 2 - 1 . 1
  => 0 . 0999999999999999
  Regex “Properties”
   
  Ruby 1 . 9
   
  /\p{Space}/
  Ruby 1 . 8 . 6
   
  /[ :space :]/
  Splat in Middle
   
  Ruby 1 . 9
   
  def foo(first, *middle, last)
   
  (->a, *b, c {p a-c}).(* 5 .downto( 1 ))

  
Fibers
1
2
3
4
5
6
7
8
9
10
11
12
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}

  
Break 可以有参数  
1
2
3
4
5
6
7
Ruby 1 . 9
   
  match =
     while line = gets
       next if line =~ /^ #/
       break line if line.find( 'ruby' )
     end

  
def嵌套def  
1
2
3
4
5
6
7
8
Ruby 1 . 9
   
  def toggle
    def toggle
      "subsequent times"
    end
    "first time"
  end
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值