lua的local問題


1. 初識

  使用Local帶來錯誤。自己寫了一個遞歸的函數,結果報錯:

local fLocal = function(n)
    if (n == 1) then
        return n;
    else
        return n + fLocal(n-1)
    end
end
print("result:", fLocal(2))

  錯誤信息:

lua: ...rk\work_diary\task\Lua_Study\code\brain_storming.lua:152: attempt to call global 'fLocal' (a nil value)
stack traceback:
    ...rk\work_diary\task\Lua_Study\code\brain_storming.lua:152: in function 'fLocal'
    ...rk\work_diary\task\Lua_Study\code\brain_storming.lua:155: in main chunk
    [C]: ?

  自己很納悶,為什么會出現問題?看到報錯,都會想到是沒有識別,作用域的問題,結果參考[1],“上面這種方式導致Lua編譯時遇到 fact(n-1) 並不知道他是局部函數 fact,Lua會去查找是否有這樣的全局函數 fact”,會有一個大概的了解。作者也給了一個解決辦法:

local fLocal
fLocal = function(n)
    if (n == 1) then
        return n;
    else
        return n + fLocal(n-1)
    end
end
print("result:", fLocal(2))

2. 分析

  分析一下,函數fLocal中是不能識別自己的,那么編譯器在到這里的時候還不能認識fLocal。這讓我想起來某個語言的定義(具體是什么忘記了):只有匹配到"}",才算定義完畢,編譯器才會識別這個定義。那是什么意思呢?拿這里的local fLocal來說只有編譯器解釋到“end”的時候才表示fLocal定義完畢,才會有這個變量,不然都是非法的,所以解決辦法就是把fLocal單獨拿出來,這樣編譯器掃描一遍的時候就認識了,不會報錯。

 

3. 升華

  還沒有達到這個地步!想去看源代碼,這里的local是怎么做的?在棧中的位置是個什么樣的?如何編譯和確定范圍的?

4. 補充

(1)local和c/c++語言一樣,變量定義的區域是從該變量定義的地方開始一直到local有效的區域結束(比如函數結尾,塊結尾或者文件結尾)。

(2)如果打印當前文件所有的local變量,就如打印_G中的內容一樣呢?

5.參考

[1]http://blog.sina.com.cn/s/blog_67536d410100thqb.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM