1. 初识

  使用Local带来错误。自己写了一个递归的函数,结果报错:

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

  错误信息:

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

  自己很纳闷,为什么会出现问题?看到报错,都会想到是没有识别,作用域的问题,结果参考[1],“上面这种方式导致Lua编译时遇到 fact(n-1) 并不知道他是局部函数 fact,Lua会去查找是否有这样的全局函数 fact”,会有一个大概的了解。作者也给了一个解决办法:

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

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问题的更多相关文章

  1. 让Lua自己把文件夹下面的所有文件自动加载起来吧

    没有想到我也做了一回标题党.其实这里边说的自动还是有夸大其词的部分.其实只是指定文件夹,然后根据指定文件夹数据,加载目录下边的内容而已. 怎么来进行Lua文件的加载 一般情况下,相关的功能需要给他创建 ...

  2. nginx+lua

    一场电闪与雷鸣的结合, 公司原有服务器已经配置好nginx,需要重新装载lua模块,哈哈哈,无法无法.   安装LUA模块需要以下 pcre       ftp://ftp.csx.cam.ac.uk ...

  3. Lua 学习笔记(九)协同程序(线程thread)

    协同程序与线程thread差不多,也就是一条执行序列,拥有自己独立的栈.局部变量和命令指针,同时又与其他协同程序共享全局变量和其他大部分东西.从概念上讲线程与协同程序的主要区别在于,一个具有多个线程的 ...

  4. Lua模块

    在lua中,我们可以直接使用require(“model_name”)来载入别的文件,文件的后缀名是.lua,载入的时候直接执行那个文件了. 比如:my.lua 文件中 print(“hello wo ...

  5. LuaSrcDiet工具介绍(lua源码处理软件)

    Diet Food Diet (nutrition), the sum of the food consumed by an organism or group Dieting, the delibe ...

  6. lua实现私有函数

    本文是原创文章,如需转载,请注明文章出处 要用lua实现私有函数,关键就是使用metatable的特性来实现. Test.lua: local v = {};v.x = 100;v.y = 200; ...

  7. Lua IO库详解

    I/O 库提供了两套不同风格的文件处理接口. 第一种风格使用隐式的文件句柄: 它提供设置默认输入文件及默认输出文件的操作, 所有的输入输出操作都针对这些默认文件. 第二种风格使用显式的文件句柄. 当使 ...

  8. nginx + lua + redis 防黑IP

    lua脚本 local redis = require "resty.redis" local red = redis.new() red.connect(red, '127.0. ...

  9. lua操作json,mysql,redis等

    ==========================example for lua json======================= local cjson = require("cj ...

随机推荐

  1. 初次使用github的艰难尝试。

    序言 github是全英文的网站,初次使用在没有翻译成中文的情况下很容易做出很多无意义或误操作. 当对本地的文件进行修改后,有时候只是想更新到fork下来的自己的仓库里,看看改得效果如何 .有时候是想 ...

  2. ajax中的异步机制导致的问题

    设置async:false;即可将请求设置为同步的,所以,我们就可以实现:在ajax请求之后再执行下面的语句.

  3. 判断字符串中是否包含Emoji表情代码

    判断字符串中是否包含Emoji表情代码: + (BOOL)stringContainsEmoji:(NSString *)string { __block BOOL returnValue = NO; ...

  4. Timer 控件

    1. 设置属性 Enable = true  或调用 start方法后, *_Tick 方法不会立即执行,会先等待一个时间间隔 2.timer1不管你上次的事情是否做完,它都会每个一个时间间隔做它应该 ...

  5. ASP.NET Visual Studio2010 发布Web网站问题详解

    今天研究了一下如何发布web网站,之前总是没耐心,遇到点问题就没心情搞了,今天总算有点耐心搞明白了.其实遇到的问题还是挺多的,网上也没有太全的解释,所以结合自己还有别人的方法进行一下总结. 环境:Wi ...

  6. redis(7)LRU缓存

    一.LRU简介 LRU是Least Recently Used的缩写,即:最近最少使用. 它是内存管理中的一种页面置换算法,对于在内存中但是又不用的数据块,操作系统会根据哪些数据属于LRU而将其移除内 ...

  7. js 判断id 是否存在

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  8. 解决Openwrt安装插件提示一下错误的办法

    解决Openwrt安装插件提示一下错误的办法 Openwrt安装17ce插件,提示一下错误: Collected errors: * check_data_file_clashes: Package ...

  9. 基于Maven的Spring + Spring MVC + Mybatis的环境搭建

    基于Maven的Spring + Spring MVC + Mybatis的环境搭建项目开发,先将环境先搭建起来.上次做了一个Spring + Spring MVC + Mybatis + Log4J ...

  10. Grunt usemin前端自动化打包流程

    前端优化是尽量减少http请求,所以我们需要尽量合并压缩文件,然后调用压缩后的文件,比如多个css文件压缩成一个,多个js文件合并压缩等,usemin能够自动在html中使用压缩后的文件,达到上面的目 ...