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