• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            馭風(fēng)萬里無垠

            ruby學(xué)習(xí)筆記《二》

            ruby的blocks和closure特性明顯有別于其它的語言,其closure本身是real closure,所綁定的context是共享的而非copy,其設(shè)計(jì)思路和lisp的相同;blocks本身則可以用于實(shí)現(xiàn)closure。二者的關(guān)系如下所述 (來源

            Yukihiro Matsumoto: You can reconvert a closure back into a block, so a closure can be used anywhere a block can be used. Often, closures are used to store the status of a block into an instance variable, because once you convert a block into a closure, it is an object that can by referenced by a variable. And of course closures can be used like they are used in other languages, such as passing around the object to customize behavior of methods. If you want to pass some code to customize a method, you can of course just pass a block. But if you want to pass the same code to more than two methods -- this is a very rare case, but if you really want to do that -- you can convert the block into a closure, and pass that same closure object to multiple methods.
            • 7種結(jié)構(gòu)

            • block方式3種
            • 隱式傳入,內(nèi)部用yield調(diào)用
              
            def thrice
              
            yield
              
            yield
              
            yield
            end

            x
            =1
            thrice {x
            +=2}
            • &block參數(shù)傳入,內(nèi)部直接操作&block
            def six_times(&block)
              thrice(
            &block)
              thrice(
            &block)
            end
             
            = 4
            six_times { x 
            += 10 }
            • &block傳入,保存block為變量,然后調(diào)用block.call
            def save_for_later(&b)
              @saved 
            = b  # Note: no ampersand! This turns a block into a closure of sorts.
            end
             
            save_for_later { puts 
            "Hello!" }
            puts 
            "Deferred execution of a block:"
            @saved.call
            @saved.call
            這里的saved保存為main對(duì)象的一個(gè)成員,后邊實(shí)現(xiàn)延遲調(diào)用。
            • Proc.new/proc
            @saved_proc_new = Proc.new { puts "I'm declared with Proc.new." }
            @saved_proc 
            = proc { puts "I'm declared with proc." }

            @saved_proc_new.call
            @saved_proc.call
            • lambda
            @saved_lambda = lambda { puts "I'm declared with lambda." }
            @saved_lambda.call
            • method
            def some_method
              puts 
            "I'm declared as a method."
            end
            @method_as_closure 
            = method(:some_method)

            • 特點(diǎn)和差異

              • return行為

            當(dāng)對(duì)應(yīng)的block里邊包含return的時(shí)候,上述7中方式有些許的不同:
            • lambda/method表現(xiàn)出真正的closure行為,僅僅返回closure本身;外部調(diào)用控制流不受影響,繼續(xù)yield或者call的下一語句執(zhí)行
            • 其它幾種會(huì)跳出外部調(diào)用者的控制流,即return出調(diào)用者,yield/call之后的也不會(huì)再執(zhí)行,直接跳出到最近的end外


            • arity - 參數(shù)個(gè)數(shù)校驗(yàn)

            對(duì)于調(diào)用點(diǎn)的參數(shù)檢查,呈現(xiàn)如下行為:
            • lambda/method嚴(yán)格校驗(yàn)參數(shù)的個(gè)數(shù),如果不匹配回拋出異常
            • 其它幾個(gè)不檢查參數(shù)個(gè)數(shù)


            • 總結(jié)

            lambda/method方式呈現(xiàn)完備的closure行為,return之后繼續(xù)下一流程,對(duì)于實(shí)際傳入?yún)?shù)個(gè)數(shù)會(huì)在調(diào)用點(diǎn)檢查;proc/blocks方式在return的時(shí)候直接返回了外部的函數(shù)或者block,對(duì)于傳入的參數(shù)個(gè)數(shù)也沒有執(zhí)行檢查。

            參考:http://innig.net/software/ruby/closures-in-ruby
            以上結(jié)論驗(yàn)證于最新的ruby1.9.3,和鏈接中的結(jié)論有些許不同;ruby1.8中的proc函數(shù)可能有不同的行為。

            posted on 2012-02-19 19:29 skyscribe 閱讀(467) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Misc

            <2025年8月>
            272829303112
            3456789
            10111213141516
            17181920212223
            24252627282930
            31123456

            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            留言簿(3)

            隨筆分類

            隨筆檔案

            搜索

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            99久久99久久精品国产片果冻| 日本强好片久久久久久AAA| 国产三级久久久精品麻豆三级| 久久久久人妻一区精品色| 香港aa三级久久三级| 亚洲Av无码国产情品久久| 久久久久久久免费视频| 久久成人永久免费播放| 久久久久亚洲AV片无码下载蜜桃| 久久无码人妻一区二区三区| 久久国产精品视频| 久久精品国产亚洲av麻豆色欲| 久久精品成人免费网站| 久久精品中文字幕一区| 国产成人无码精品久久久久免费 | 久久天堂电影网| 亚洲人成精品久久久久| 久久国产精品免费一区| 久久久综合九色合综国产| 成人午夜精品无码区久久| 亚洲第一永久AV网站久久精品男人的天堂AV| 亚洲国产一成人久久精品| 久久久久久av无码免费看大片| 国产精品无码久久综合| 99精品久久久久久久婷婷| 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区 | 欧美亚洲日本久久精品| 26uuu久久五月天| 精品久久久久香蕉网| 嫩草伊人久久精品少妇AV| 成人综合久久精品色婷婷| 午夜精品久久久久久影视777| 久久久精品国产Sm最大网站| 亚洲国产精品久久久久婷婷软件| 国产成人综合久久综合| 国产精品无码久久久久久| 国产精品99久久久久久人| 久久91精品久久91综合| 久久综合狠狠色综合伊人| 99久久精品国产一区二区三区 | 精品久久香蕉国产线看观看亚洲|