<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    莊周夢蝶

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

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

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

    一、新的語法和語義
    1、新的Hash定義語法:
    例如{a:2}  等價(jià)于 {:a=>2}
    但是 {"a":2} 出錯,并不等價(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是錯誤的,而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

    主站蜘蛛池模板: 在线视频网址免费播放| www.av在线免费观看| 182tv免费视视频线路一二三| 国产亚洲综合久久系列| 国产免费久久精品丫丫| 国产国拍精品亚洲AV片| 国产美女视频免费观看的网站| 亚洲精品视频久久久| 精品一区二区三区免费观看| 国产亚洲精品不卡在线| a毛片免费观看完整| 亚洲大尺度无码无码专区| 日本免费大黄在线观看| 亚洲性色成人av天堂| 在线观看免费毛片| 黄页免费视频播放在线播放| 久久99亚洲综合精品首页| 国产好大好硬好爽免费不卡| 亚洲国产高清视频在线观看| 久久久久久国产精品免费免费| 亚洲美国产亚洲AV| 国产亚洲成人久久| 国产h肉在线视频免费观看| 亚洲欧美日韩一区二区三区在线| 国产精品麻豆免费版| 免费看无码特级毛片| 亚洲成a人片在线观看中文!!! | 久热中文字幕在线精品免费| 亚洲综合在线一区二区三区 | 中文字幕精品无码亚洲字| 久久99青青精品免费观看| 97se亚洲国产综合自在线| 国产v片免费播放| 久草免费手机视频| 亚洲色大18成人网站WWW在线播放| 亚洲国产精品尤物yw在线 | 黄色三级三级免费看| 亚洲人成亚洲精品| 四虎影在线永久免费四虎地址8848aa| 两个人日本WWW免费版| 中文字幕亚洲精品无码|