莊周夢蝶

          生活、程序、未來
             :: 首頁 ::  ::  :: 聚合  :: 管理

          Ruby 1.9概要(1)新的語法和語義

          Posted on 2008-10-01 13:37 dennis 閱讀(771) 評論(0)  編輯  收藏 所屬分類: 動(dòng)態(tài)語言

          一、新的語法和語義
          1、新的Hash定義語法:
          例如{a:2}  等價(jià)于 {:a=>2}
          但是 {"a":2} 出錯(cuò),并不等價(jià)于 {:"a"=>2}

          2、試驗(yàn)性質(zhì)的block內(nèi)的局部變量
          在1.8,block的與外部同名的變量是同一個(gè)變量,也就是說block內(nèi)的變量也可以修改外部的同名變量,這很容易形成難以查找的bug。
          例子:
          # {常規(guī)參數(shù);局部變量}
          = 2
          = lambda{|;d| d = 1}
          a.call()
          d        
          # => 2

          注意到,分號后的d是block局部變量。

          3、block的參數(shù)現(xiàn)在都是局部變量

          4、新lambda語法,試驗(yàn)性質(zhì):
          ->a,b {a+b}.call(1,2)   => 3

          一些比較詭異的寫法:
          -> { }.call # => nil
          -> a, b  { a + b }.call(1,2# => 3
          = 1-> a, b; c  { c = a + b }.call(1,2); c # => 1(注意這里,;號的c是block的局部變量,因此c=1在lambda調(diào)用前后沒有改變。)

          5、 .()的調(diào)用方式
          過去
          lambda{|*d| d}.call(1,2,3)

          現(xiàn)在可以簡化為
          lambda{|*d| d}.(1,2,3)

          .()這樣的方式都將調(diào)用接受者的call方法,無論接收者是什么,例如:
           "foo".(1,2)   # ~>  undefined method `call' for "foo":String (NoMethodError)

          顯然,這個(gè)方式另一種形式上的method_missing,比如在類中應(yīng)用:

          class Test
            
          def self.call(*d)
               d
             end
          end
          Test.(
          1,2,3)  => [1,2,3]
          這個(gè)特性也是試驗(yàn)性質(zhì)

          6、block可以使用&block做參數(shù)咯。
          例子:
          class Test
             define_method :foo 
          lambda{|&b| b.call("hello")}
          end
          t
          =Test.new
          t.foo do 
          |b|
             puts b    
          => hello
          end

          7、新的block參數(shù)語義,|v| 現(xiàn)在等價(jià)于 |v,|
          還是通過例子吧:
          1.8:
          def m; yield 12; end
          m{
          |v| v}                                          # => [1, 2]
                                                            # !> multiple values for a block parameter (2 for 1)
          1.9:
          def m; yield 12; end
          m{
          |v| v}                                          # => 1

          8、允許數(shù)組多重展開
          def foo(*a)
               a
          end
          foo(
          1*[2,3], 4*[5,6])                        # => [1, 2, 3, 4, 5, 6]

          = [1,2,3]
          = [4,5,6]
          [
          *a, *b]                                         # => [1, 2, 3, 4, 5, 6]

          9、可選參數(shù)后允許再有強(qiáng)制參數(shù)的存在,這在過去是不允許的。例如下面的代碼在1.8是錯(cuò)誤的,而1.9卻可以正常運(yùn)行:
          def foo(a,b="test",c)
            puts c
          end
          foo(
          1)   => wrong number of arguments(1 for 2)
          foo(
          1,2=> 2
          foo(
          1,3=> 3
          foo(
          1,2,3)  =>3
          更復(fù)雜的:
          def m(a, b=nil, *c, d)
               [a,b,c,d]
          end
          m(
          1)  =>error
          m(
          1,2)  => [1,nil,[],2]
          m(
          1,2,3=>[1,2,[],3]
          m(
          1,2,3,4)  =>[1,2,[3],4]
          m(
          1,2,3,4,5)   => [1,2,[3,4],5]
          m(
          1,2,3,4,5,6]  =>[1,2,[3,4,5],6]

          10、?c的語義,過去?+字符返回字符的ascii碼整數(shù),現(xiàn)在返回字符"c"
          例如:
          ?a  => 97  (1.8)
          ?a  
          => "a" (1.9)

          11、[]方法的參數(shù)現(xiàn)在可以將數(shù)組和hash聯(lián)合使用,例如下面的例子:
          class Test
             
          def [](*a)
               puts a.inspect
             end
          end
          a
          =[1,2,3]
          Test.new[
          *a,:a=>2]   =>  SyntaxERROR:compire error (1.8)
          Test.new[
          *a,:a=>2=>  [1,2,3,{:a=>2}] (1.9)


          12、打印字符,打印字符和負(fù)數(shù),
          1.8
            printf 
          "%c","a"  => can't convert String into Integer
            printf "%u",-1   => ..4294967295

          1.9:
            printf 
          "%c","a"  => a
            printf 
          "%u",-1   => -1
          13、defined?方法和local variable:

          RUBY_VERSION                                      
          # => "1.8.5"
          RUBY_RELEASE_DATE                                 # => "2006-08-25"
          = 0
          defined? a                                        
          # => "local-variable"
          1.times do |i|
            defined? i                                      
          # => "local-variable(in-block)"
          end

          VS.

          RUBY_VERSION                                      
          # => "1.9.0"
          RUBY_RELEASE_DATE                                 # => "2007-08-03"
          = 0
          defined? a                                        
          # => "local-variable"
          1.times do |i|
            defined? i                                      
          # => "local-variable"
          end

          主站蜘蛛池模板: 鹤山市| 凤翔县| 定边县| 德州市| 灌南县| 兴仁县| 东港市| 刚察县| 手机| 鄂托克前旗| 伊金霍洛旗| 西平县| 邻水| 沅江市| 墨玉县| 通江县| 新田县| 盘山县| 浮梁县| 安泽县| 海淀区| 安宁市| 蒙城县| 乌拉特前旗| 武清区| 洞口县| 河间市| 乐业县| 太原市| 黄石市| 冀州市| 桐柏县| 都安| 济源市| 眉山市| 贵德县| 前郭尔| 周口市| 肥城市| 靖安县| 招远市|