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