<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                ## Closure 目前為止關于函數式編程各種功能的討論都只局限在“純”函數式語言范圍內:這些語言都是lambda演算的實現并且都沒有那些和阿隆佐形式系統相沖突的特性。然而,很多函數式語言的特性哪怕是在lambda演算框架之外都是很有用的。確實,如果一個公理系統的實現可以用數學思維來看待程序,那么這個實現還是很有用的,但這樣的實現卻不一定可以付諸實踐。很多現實中的語言都選擇吸收函數式編程的一些元素,卻又不完全受限于函數式教條的束縛。很多這樣的語言(比如Common Lisp)都不要求所有的變量必須為final,可以修改他們的值。也不要求函數只能依賴于它們的參數,而是可以讀寫函數外部的狀態。同時這些語言又包含了FP的特性,如高階函數。與在lambda演算限制下將函數作為參數傳遞不同,在指令式語言中要做到同樣的事情需要支持一個有趣的特性,人們常把它稱為lexical closure。還是來看看例子。要注意的是,這個例子中變量不是final,而且函數也可以讀寫其外部的變量: ~~~ Function makePowerFn(int power) { int powerFn(int base) { return pow(base, power); } return powerFn; } Function square = makePowerFn(2); square(3); // returns 9 ~~~ makePowerFn函數返回另一個函數,這個新的函數需要一個整數參數然后返回它的平方值。執行square(3)的時候具體發生了什么事呢?變量power并不在powerFn的域內,因為makePowerFn早就運行結束返回了,所以它的棧也已經不存在了。那么square又是怎么正常工作的呢?這個時候需要語言通過某種方式支持繼續存儲power的值,以便square后面繼續使用。那么如果再定義一個函數,cube,用來計算立方,又應該怎么做呢?那么運行中的程序就必須存儲兩份power的值,提供給makePowerFn生成的兩個函數分別使用。這種保存變量值的方法就叫做closure。closure不僅僅保存宿主函數的參數值,還可以用在下例的用法中: ~~~ Function makeIncrementer() { int n = 0; int increment() { return ++n; } } Function inc1 = makeIncrementer(); Function inc2 = makeIncrementer(); inc1(); // returns 1; inc1(); // returns 2; inc1(); // returns 3; inc2(); // returns 1; inc2(); // returns 2; inc2(); // returns 3; ~~~ 運行中的程序負責存儲n的值,以便incrementer稍后可以訪問它。與此同時,程序還會保存多份n的拷貝,雖然這些值應該在makeIncrementer返回后就消失,但在這個情況下卻繼續保留下來給每一個incrementer對象使用。這樣的代碼編譯之后會是什么樣子?closure幕后的真正工作機理又是什么?這次運氣不錯,我們有一個后臺通行證,可以一窺究竟。 一點小常識往往可以幫大忙。乍一看這些本地變量已經不再受限于基本的域限制并擁有無限的生命周期了。于是可以得出一個很明顯的結論:它們已經不是存在棧上,而是堆上了8。這么說來closure的實現和前面討論過的函數差不多,只不過closure多了一個額外的引用指向其外部的變量而已: ~~~ class some_function_t { SymbolTable parentScope; // ... } ~~~ 當closure需要訪問不在它本地域的變量時,就可以通過這個引用到更外一層的父域中尋找該變量。謎底揭開了!closure將函數編程與面向對象的方法結合了起來。下一次為了保存并傳遞某些狀態而創建類的時候,想想closure。它能在運行時從相應的域中獲得變量,從而可以把該變量當初“成員變量”來訪問,也因為這樣,就不再需要去創建一個成員變量了。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看