1. 初識
使用local帶來錯誤。自己寫了乙個遞迴的函式,結果報錯:
local flocal = function(n)if (n == 1) then
returnn;else
return n + flocal(n-1)end
endprint("result:", flocal(2))
錯誤資訊:
lua: ...rk\work_diary\task\lua_study\code\brain_storming.lua:152: attempt to call global 'flocal' (a nilvalue)
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: inmain chunk
[c]: ?
自己很納悶,為什麼會出現問題?看到報錯,都會想到是沒有識別,作用域的問題,結果參考[1],「上面這種方式導致lua編譯時遇到 fact(n-1) 並不知道他是區域性函式 fact,lua會去查詢是否有這樣的全域性函式 fact」,會有乙個大概的了解。作者也給了乙個解決辦法:
localflocal
flocal= function(n)if (n == 1) then
returnn;else
return n + flocal(n-1)end
endprint("result:", flocal(2))
2. 分析
分析一下,函式flocal中是不能識別自己的,那麼編譯器在到這裡的時候還不能認識flocal。這讓我想起來某個語言的定義(具體是什麼忘記了):只有匹配到"}",才算定義完畢,編譯器才會識別這個定義。那是什麼意思呢?拿這裡的local flocal來說只有編譯器解釋到「end」的時候才表示flocal定義完畢,才會有這個變數,不然都是非法的,所以解決辦法就是把flocal單獨拿出來,這樣編譯器掃瞄一遍的時候就認識了,不會報錯。
3. 昇華
還沒有達到這個地步!想去看源**,這裡的local是怎麼做的?在棧中的位置是個什麼樣的?如何編譯和確定範圍的?
4. 補充
(1)local和c/c++語言一樣,變數定義的區域是從該變數定義的地方開始一直到local有效的區域結束(比如函式結尾,塊結尾或者檔案結尾)。
(2)如果列印當前檔案所有的local變數,就如列印_g中的內容一樣呢?
5.參考
[1]
local lua 多個 Lua 變數
lua 變數 變數在使用前,需要在 中進行宣告,即建立該變數。編譯程式執行 之前編譯器需要知道如何給語句變數開闢儲存區,用於儲存變數的值。lua 變數有三種型別 全域性變數 區域性變數 表中的域。lua 中的變數全是全域性變數,那怕是語句塊或是函式裡,除非用 local 顯式宣告為區域性變數。區域性...
local lua 多個 檢測Lua指令碼中的死迴圈
論壇上有人問,所以把以前做的東西拿出來秀一下。lua是一門小巧精緻的語言,特別適用於嵌入其它的程式為它們提供指令碼支援。不過指令碼通常是使用者編寫的,很有可能出現死迴圈,雖說這是使用者的問題,但卻會造成我們的宿主程式死掉。所以檢測使用者指令碼中的死迴圈並中止這段指令碼的執行就顯得非常重要了。可是,乙...
Lua函式的多個返回值
lua中的函式的乙個很特殊也很有用的性質,即可以有多個返回值。包括一些內建的函式就是這樣。比如string.find函式,在給定的字串中查詢乙個pattern,如果有匹配的部分,則返回對應的頭 尾的兩個索引值 如果不存在匹配,則返回nil。當然,使用者定義的函式也可以有多個返回值,通過return關...