• <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>

            馭風萬里無垠

            ruby學習筆記《二》

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

            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種結構

            • block方式3種
            • 隱式傳入,內部用yield調用
              
            def thrice
              
            yield
              
            yield
              
            yield
            end

            x
            =1
            thrice {x
            +=2}
            • &block參數傳入,內部直接操作&block
            def six_times(&block)
              thrice(
            &block)
              thrice(
            &block)
            end
             
            = 4
            six_times { x 
            += 10 }
            • &block傳入,保存block為變量,然后調用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對象的一個成員,后邊實現延遲調用。
            • 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)

            • 特點和差異

              • return行為

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


            • arity - 參數個數校驗

            對于調用點的參數檢查,呈現如下行為:
            • lambda/method嚴格校驗參數的個數,如果不匹配回拋出異常
            • 其它幾個不檢查參數個數


            • 總結

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

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

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

            <2025年7月>
            293012345
            6789101112
            13141516171819
            20212223242526
            272829303112
            3456789

            導航

            統(tǒng)計

            常用鏈接

            留言簿(3)

            隨筆分類

            隨筆檔案

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            国内精品久久久久影院老司| 青青草国产精品久久| 欧美久久一级内射wwwwww.| 久久久久免费视频| 亚洲午夜久久久久妓女影院| 人妻精品久久久久中文字幕69| 久久精品国产99国产精品澳门| 狠狠久久综合| 日韩人妻无码一区二区三区久久| 亚洲成色999久久网站| 久久伊人五月丁香狠狠色| 亚洲天堂久久精品| 亚洲国产另类久久久精品黑人| 国产精品日韩欧美久久综合| 久久久久久久波多野结衣高潮| 色综合久久88色综合天天| 日本欧美久久久久免费播放网| 久久精品国产清自在天天线| MM131亚洲国产美女久久| 久久精品一本到99热免费| 久久强奷乱码老熟女| 97久久精品人妻人人搡人人玩| 久久天天躁狠狠躁夜夜2020一| 国产69精品久久久久9999| 久久中文字幕一区二区| 精品无码久久久久久午夜| 亚洲va久久久噜噜噜久久狠狠| 三级韩国一区久久二区综合| 精品久久久无码中文字幕| 精品久久香蕉国产线看观看亚洲 | 日韩久久久久中文字幕人妻| 狠狠色婷婷综合天天久久丁香| 欧美一区二区三区久久综| 亚洲愉拍99热成人精品热久久| 亚洲精品国产第一综合99久久| 久久精品中文字幕有码| 国产午夜电影久久| 久久精品中文字幕一区| 一级做a爰片久久毛片毛片| 亚洲国产成人久久综合区| 色老头网站久久网|