Lua中 'local xxx do ... end' 到底表达了什么
来源:互联网 发布:keynote mac版 编辑:程序博客网 时间:2024/04/30 14:06
前言
在一些lua的项目中偶尔会发现local xxx do ... end
这种写法,那么这种写法有什么作用,或者说这么写又有什么好处呢?下面我们来逐步分析一下。
分析
首先实际代码中的写法可能看起来是这样的:
local subBlock dofunction func1( ... ) -- bodyendname = "test"local array = {1, 2, 3, 4}endprint("name =", name)print("array =", array)
我们知道,其实do ... end
就是执行了一个语句块,并没有什么特殊的含义,它基本上等同于C/C++中的{},需要注意的是在这个{}之间的局部变量,在这个区域之后的位置是没有办法引用的,在lua中也是一样的,只不过在lua中可以随意的定义全局变量,所以在do ... end
之间的定义的全局变量,在语句块之后也可以引用。
因此执行上述lua代码的结果如下:
name = test
array = nil
那么subBlock
这个变量和这个语句块有什么关系呢?subBlock
看起来很像是这个语句块的名字,实际实测发现并没有什么关系,实际上这就是已定义了一个局部变量,并且在后面执行了一个语句块,除此之外貌似毫无关系。
我们可以写成这样:
local ado print("test1")end
还可以写成这样:
local a = "test2"do print("a =", a)end
甚至是这样:
local a, b, c = "test3", 1, 0do print("a =", a)end
看到这里是不是发现’local xxx do … end’这个结构很简单的,可是这个local
还可以和’do … end’产生关系,比如像下面这样:
local blockdo local a = 1 function block() print("a =", a) end print(block)end
说到这里,local
又和do ... end
产生了联系,那么这个block函数到底是局部函数还是全局函数呢?我们下来看看下面的例子:
local function func1() function func2() -- body end print("call func1 ...")end
上述代码中的func1
函数明显是一个局部函数,那func2
函数到底是一个局部函数和全局函数呢?我们知道全局的变量和函数可以在_G
中查到,利用这个特点我们可以测试一下,写出如下代码:
local function func1() function func2() -- body end print("call func1 ...")endprint("func1 =", _G["func1"])print("func2 =", _G["func2"])
运行的结果如下:
func1 = nil
func2 = nil
有没有很惊奇func2
居然不是全局函数,会不会是我们漏掉了什么,我们运行一下func1
函数试试,写出如下测试代码:
local function func1() function func2() -- body end print("call func1 ...")endprint("func1 =", _G["func1"])print("func2 =", _G["func2"])func1()print("func1 =", _G["func1"])print("func2 =", _G["func2"])
运行的结果如下:
func1 = nil
func2 = nil
call func1 …
func1 = nil
func2 = function: 0057E330
看来这次比较符合预期,func2
是一个全局函数,只不过需要运行fucn1
之后才能有定义。
那么现在我们回过头来看一下这个例子:
local blockdo local a = 1 function block() print("a =", a) end print(block)endprint("block =", _G['block'])
实际上你如果认真看了前面的分析,你会发现这与在函数中定义函数的例子是不一样的,这仅仅在定义了一个局部变量之后又定义了一个同名的函数而已,那是不是函数block
会覆盖局部变量block
而变成全局函数呢?答案是否定的,我们知道function block()
只是block = function()
的语法糖,所以看到这里你或许已经明白了,block最终就是一个局部函数,运行结果如下:
function: 001DFD68
block = nil
结论
local xxx do ... end
这种表达方式只是一种定义局部变量和执行一个语句块的组合,没有其他特殊含义。- 遇到类似的问题只需要一步一步跟踪就能发现真相。
- Lua中 'local xxx do ... end' 到底表达了什么
- target XXX do ->end 常见问题
- WDF驱动中,当我们写下WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(XXX, YYY)到底发生了什么?
- do Lua语言学习(一) end
- do Lua语言学习(二) end
- PM到底做什么(What Do Product Managers Do?)
- .NET 3.5框架中到底发生了什么巨变?
- java中final关键字到底修饰了什么
- synchronized 语句块中到底锁住了什么对象 ?
- RxJava中操作符到底做了什么?
- java中类继承,到底继承了什么?
- C/C++的编译过程中到底发生了什么?
- Android的Activity中setContentView到底经历了什么?
- lua中尽量使用local
- DispatchMessage到底干了什么
- JavaEE到底忽略了什么?
- JavaEE到底忽略了什么?
- JavaEE到底忽略了什么?
- lightoj-1138-Trailing Zeroes (III) -二分查找
- android sutdio调试无线连接,直正的丢掉数据线 ADB WIFI
- ThinkPHP3.2.3实现QQ等第三方登录
- JAVA代码覆盖率工具JaCoCo-原理简单分析
- c/c++常考面试题(二)
- Lua中 'local xxx do ... end' 到底表达了什么
- python函数参数传递规则
- Matplotlib的中文字体显示为方块的问题
- OpenCV摄像头捕获
- SLF4J源码解析-LoggerFactory(一)
- cshtml $ is undefined
- IIS 配置PHP环境HTTP 500错误处理方法
- ISAKMP报文解密
- Ubuntu 登陆无限闪退