码迷,mamicode.com
首页 > 其他好文 > 详细

lua的local问题

时间:2015-01-23 21:31:14      阅读:232      评论:0      收藏:0      [点我收藏+]

标签:

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

lua的local问题

标签:

原文地址:http://www.cnblogs.com/pk-run/p/4244989.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!