lua的local问题
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问题的更多相关文章
- 让Lua自己把文件夹下面的所有文件自动加载起来吧
没有想到我也做了一回标题党.其实这里边说的自动还是有夸大其词的部分.其实只是指定文件夹,然后根据指定文件夹数据,加载目录下边的内容而已. 怎么来进行Lua文件的加载 一般情况下,相关的功能需要给他创建 ...
- nginx+lua
一场电闪与雷鸣的结合, 公司原有服务器已经配置好nginx,需要重新装载lua模块,哈哈哈,无法无法. 安装LUA模块需要以下 pcre ftp://ftp.csx.cam.ac.uk ...
- Lua 学习笔记(九)协同程序(线程thread)
协同程序与线程thread差不多,也就是一条执行序列,拥有自己独立的栈.局部变量和命令指针,同时又与其他协同程序共享全局变量和其他大部分东西.从概念上讲线程与协同程序的主要区别在于,一个具有多个线程的 ...
- Lua模块
在lua中,我们可以直接使用require(“model_name”)来载入别的文件,文件的后缀名是.lua,载入的时候直接执行那个文件了. 比如:my.lua 文件中 print(“hello wo ...
- LuaSrcDiet工具介绍(lua源码处理软件)
Diet Food Diet (nutrition), the sum of the food consumed by an organism or group Dieting, the delibe ...
- lua实现私有函数
本文是原创文章,如需转载,请注明文章出处 要用lua实现私有函数,关键就是使用metatable的特性来实现. Test.lua: local v = {};v.x = 100;v.y = 200; ...
- Lua IO库详解
I/O 库提供了两套不同风格的文件处理接口. 第一种风格使用隐式的文件句柄: 它提供设置默认输入文件及默认输出文件的操作, 所有的输入输出操作都针对这些默认文件. 第二种风格使用显式的文件句柄. 当使 ...
- nginx + lua + redis 防黑IP
lua脚本 local redis = require "resty.redis" local red = redis.new() red.connect(red, '127.0. ...
- lua操作json,mysql,redis等
==========================example for lua json======================= local cjson = require("cj ...
随机推荐
- spring、springmvc和mybatis整合(java config方式)
之前项目中使用ssm框架大多是基于xml的方式,spring3.0以后就提供java config的模式来构建项目,并且也推荐使用这种方式,自从接触过springboot后,深深感受到这种纯java配 ...
- Docker搭建tomcat运行环境(修改镜像方式)
对于java程序员来说,要想使用Docker来部署你的应用,那么在镜像中安装类似于tomcat的容器基本上是必须的(sprintboot项目除外),本篇介绍自己基于对centos镜像的修改,创建自己的 ...
- centos 7编译安装apache
1.安装工具和依赖包 yum install unzipyum -y install gcc gcc-c++ 2.创建软件安装目录mkdir /usr/local/{apr,apr-util,apr- ...
- centos7 配置php-fpm
1.复制相应的文件cp /usr/local/php7/etc/php-fpm.conf.default /usr/local/php7/etc/php-fpm.confcp /usr/local/p ...
- Jquery jqXHR对象的属性和方法
在 jQuery 1.4 之前(包括1.4),$.ajax() 方法返回的是浏览器原生的 XMLHttpRequest 对象. 从 jQuery 1.5 开始,$.ajax() 方法返回 jQuery ...
- 【Linux】Linux C socket 编程之UDP
发送方: /* * File: main.c * Author: tianshuai * * Created on 2011年11月29日, 下午10:34 * * 主要实现:发送20个文本消息,然后 ...
- CCF 201409-4 最优配餐
问题描述 试题编号: 201409-4 试题名称: 最优配餐 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 栋栋最近开了一家餐饮连锁店,提供外卖服务.随着连锁店越来越多,怎么 ...
- log4j DailyRollingFileAppender, DatePattern 配置
在DailyRollingFileAppender中可以指定monthly(每月). weekly(每周).daily(每天).half-daily(每半天).hourly(每小时)和minutely ...
- git忽略ssl认证
问题 在是用git克隆仓库的时候,报错如下: fatal: unable to access ‘https://github.com/........../‘: OpenSSL SSL_connect ...
- Memcached 查询stats及各项状态解释
一.两个最常用状态查询(掌握第一个就完全OK了) 1)查看状态:printf “stats\r\n” |nc 127.0.0.1 11211 2)模拟top命令查看状态:watch “ech ...