前言

在一些lua的项目中偶尔会发现local xxx do ... end这种写法,那么这种写法有什么作用,或者说这么写又有什么好处呢?下面我们来逐步分析一下。

分析

首先实际代码中的写法可能看起来是这样的:

local subBlock dofunction func1( ... )-- body
endname = "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 a
doprint("test1")
end

还可以写成这样:

local a = "test2"
doprint("a =", a)
end

甚至是这样:

local a, b, c = "test3", 1, 0
doprint("a =", a)
end

看到这里是不是发现’local xxx do … end’这个结构很简单的,可是这个local 还可以和’do … end’产生关系,比如像下面这样:

local block
dolocal a = 1function block()print("a =", a)endprint(block)
end

说到这里,local又和do ... end产生了联系,那么这个block函数到底是局部函数还是全局函数呢?我们下来看看下面的例子:

local function func1()function func2()-- bodyendprint("call func1 ...")
end

上述代码中的func1函数明显是一个局部函数,那func2函数到底是一个局部函数和全局函数呢?我们知道全局的变量和函数可以在_G中查到,利用这个特点我们可以测试一下,写出如下代码:

local function func1()function func2()-- bodyendprint("call func1 ...")
endprint("func1 =", _G["func1"])
print("func2 =", _G["func2"])

运行的结果如下:

func1 = nil
func2 = nil

有没有很惊奇func2居然不是全局函数,会不会是我们漏掉了什么,我们运行一下func1函数试试,写出如下测试代码:

local function func1()function func2()-- bodyendprint("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 block
dolocal a = 1function block()print("a =", a)endprint(block)
endprint("block =", _G['block'])

实际上你如果认真看了前面的分析,你会发现这与在函数中定义函数的例子是不一样的,这仅仅在定义了一个局部变量之后又定义了一个同名的函数而已,那是不是函数block会覆盖局部变量block而变成全局函数呢?答案是否定的,我们知道function block()只是block = function()的语法糖,所以看到这里你或许已经明白了,block最终就是一个局部函数,运行结果如下:

function: 001DFD68
block = nil

结论

  1. local xxx do ... end这种表达方式只是一种定义局部变量和执行一个语句块的组合,没有其他特殊含义。
  2. 遇到类似的问题只需要一步一步跟踪就能发现真相。

Lua中 'local xxx do ... end' 到底表达了什么相关推荐

  1. Lua中local变量和非local变量的区别

    示栗代码: local myClass = { m = 10,n = 11}function myClass:new()local self = {}setmetatable(self,{__inde ...

  2. 两个函数彻底理解Lua中的闭包

    本文通过两个函数彻底搞懂Lua中的闭包,相信看完这两个函数,应该能理解什么是Lua闭包.废话不多说,上 code: 1 --[[************************************ ...

  3. Lua中的模块和使用

    简介 从Lua5.1版本开始,就对模块/包添加了新的支持,可是使用require函数和package函数来加载模块,使用table模拟module来定义模块. 函数require用于加载模块,modu ...

  4. Lua中实现类似C#的事件机制

    本文为 博客园 simonw 原创,转载请标明出处. 作者:simonw 原文:http://www.cnblogs.com/simonw/archive/2006/12/20/597986.html ...

  5. XLua源码学习:Lua中调用CS

    在使用lua代码开发的过程中,一个非常重要的部分是对C#代码的调用,接下来就结合源码分析理解它的实现: 在lua中,使用诸如以下代码便可以调用C#的代码: CS.UnityEngine.Debug.L ...

  6. 简单介绍Lua中的变量与赋值方法

    今天小编就为大家分享一篇关于Lua中的变量与赋值方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧 看以下案例: test.lua -- 第一个lua脚本 ...

  7. Lua中的模块与module函数详解

    很快就要开始介绍Lua里的"面向对象"了,在此之前,我们先来了解一下Lua的模块. 1.编写一个简单的模块 Lua的模块是什么东西呢?通常我们可以理解为是一个table,这个tab ...

  8. Lua中使用Sleep函数

    Lua中没有内置的Sleep函数,有4种方法可以实现Sleep函数功能,如下: 方法1 在一个死循环中设置一个跳出条件,但是这样的做法会占用大量CPU资源,强烈不推荐使用. function Slee ...

  9. Cocos2d-x 脚本语言Lua中的面向对象

    Cocos2d-x 脚本语言Lua中的面向对象 面向对象不是针对某一门语言,而是一种思想.在面向过程的语言也能够使用面向对象的思想来进行编程. 在Lua中,并没有面向对象的概念存在,没有类的定义和子类 ...

最新文章

  1. 设计模式C#描述之——简单工厂模式、抽象工厂模式、单例与多例模式
  2. Sql Server XML
  3. java udp分别用DatagramSocket和DatagramChannel实现多计算机接收广播数据
  4. leetcode96. 不同的二叉搜索树
  5. clickhouse 重启_篇一|ClickHouse快速入门
  6. 四川第七届 C Censor (字符串哈希)
  7. sqlserver数据库 表中字段值有空格,如何去除空格(例如char (5) 存入数据不足5位时sqlserver会自动补空格)...
  8. (已解决) centos6.5 yum源 失效 The whole CentOS 6 is dead and shouldn’t be used anywhere at all
  9. WPF学习笔记(5):两个DataGrid的滚动条实现同步滚动(转)
  10. 黑苹果安装镜像制作方法
  11. 同步发电机励磁调节实验原理_发电机组自动控制系统工作原理
  12. 【筆記】八部金剛功-張道長口述記載
  13. 【easyui】combobox 静态数据时,设置默认值时,不触发onselect事件
  14. 初识等级保护,要点整理
  15. linux命令行测试上网,如何使用linux命令行来测试网速
  16. python判断正数和负数教案_(完整版)正数和负数教学设计
  17. EasyX库使用入门
  18. 怎么去理解JAVA中类与对象的关系
  19. RecycleView实现Gallery画廊效果,中间放大两边缩小
  20. 量子物理史话 第三章 火流星

热门文章

  1. hdu 4063 Aircraft
  2. 关于Python错误:“TypeError: Dog() takes no arguments”
  3. 黑话(网络安全专业术语)
  4. VC6中代替 gotoxy() 和 clrscr() 方法
  5. vba monthview控件64位_VBA对多列指定类型的单元格进行数据排重
  6. vi/vim行复制,粘贴,删除操作
  7. python 团体程序设计天梯赛 L1-020 帅到没朋友
  8. Jmeter 参数化实现
  9. VRRP+track
  10. 云南农业大学C语言程序设计,云南农业大学341农业知识综合三考研真题笔记期末题等...