LUA重难点解析

时间:2023-02-21 23:31:05

1、元表

  元表也是一个 table,它附加在另一个 table 上,可以扩展该 table 的某些行为。

  拿 __index 来举例,它是用来扩展查找索引行为的。在查找一个 key 对应的值时,会依次经历如下规则:

  1、查找表中是否存在该索引 key,如存在,则取出相应值,如不存在则继续。

  2、查找该表的元表(如果有元表),是否存在 __index 键,如果存在 __index 键,则分两种情况:若 __index 对应的是一个函数,则调用该函数得出相应值;若 __index 对应的是一个表,则从此表中查找 key,如果不存在,则查找该表是否存在元表,如此循环。

  注意,设置元表的某项行为键时,可以将元表自身设置为相应的值,如: metaTable.__index = metaTable

t = {userid=,username="lua"}
t1 = {age=}
t2 = {
__index=
function(_t,key) --这里的第一个参数指向被附加表
print(_t.username); --"lua"
return #key
end
} setmetatable(t,t1)
print(t.age) --nil
t1.__index = t1
print(t.age) -- setmetatable(t,t2)
print(t.age) --3

   所以,元表是这样一种表:它通过不同的键,为被附加表定义了不同的扩展行为。这些行为有:

__add(a, b) --加法
__sub(a, b) --减法
__mul(a, b) --乘法
__div(a, b) --除法
__mod(a, b) --取模
__pow(a, b) --乘幂
__unm(a) --相反数
__concat(a, b) --连接
__len(a) --长度
__eq(a, b) --相等
__lt(a, b) --小于
__le(a, b) --小于等于
__index(a, b) --索引查询
__newindex(a, b, c) --索引更新(PS:不懂的话,后面会有讲)
__call(a, ...) --执行方法调用
__tostring(a) --字符串输出
__metatable --保护元表

2、协程

  Lua 的协程和 Unity 的协程一样,并不是真正的多线程,而只是在一个线程中轮流执行。

  Lua 通过 coroutine.create(func) 来启动一个协程,刚启动的协程并不会立即工作,它处于就绪态,需要调用 coroutine.resume(co,...) 来重入启动执行(co 是 coroutine.create(func) 的返回值),然后进入 func 函数内,遇到 coroutine.yield(...) 函数来暂停进入等待态,将执行权交给协程外部程序,然后在协程外部可以再通过 coroutine.resume(co,...) 来重入协程内部之前的 yield 处继续执行,如此反复直到协程函数执行完毕。

  我们看到 coroutine.resume(co,...) 除了第一个参数指明要重入的协程之外,还可以传入其它参数,当初始化一个协程第一次 resume 时,传入的其它参数会作为协程函数的参数带入,而 coroutine.yield(...) 的参数,会传回协程外,通过 local ret,... = coroutine.resume(co,...) 来获取,注意 ret 是 bool 表示重入成功还是失败,后面的返回值才是 yield 传回的参数;而再次调用 coroutine.resume(co,...) 重入时,resume 的其它参数也会传到协程内,由 local ... = coroutine.yield(...) 来获取。

  关于 resume 和 yield 之间的数据交换非常神奇,需要理解透彻。

3、IDE

看上去最舒服的 IDE 是 IntelliJ IDEA,搜索 lua 插件安装,新建 LUA 项目,右键工程选择 “Open Module Settings” ,选择 SDKs 添加一个名为 lua53 的 sdk, home path 填写 lua 可执行目录,一般在 /usr/local/bin 下,classpath 填写

/Users/yugd/Library/Application Support/IdeaIC2017.1/Lua

然后再选择 Libraries,同样添加一次,保存即可 

Lua 5.3 参考手册

http://cloudwu.github.io/lua53doc/manual.html 

LUA重难点解析的更多相关文章

  1. .NET_RSA加密全接触(重、难点解析)

    .NET_RSA加密全接触(重.难点解析) .NET Framework提供了两个类供我们使用RSA算法,分别是:用于加密数据的RSACryptoServiceProvider和用于数字签名的DSAC ...

  2. Collection集合重难点梳理,增强for注意事项和三种遍历的应用场景,栈和队列特点,数组和链表特点,ArrayList源码解析, LinkedList-源码解析

    重难点梳理 使用到的新单词: 1.collection[kəˈlekʃn] 聚集 2.empty[ˈempti] 空的 3.clear[klɪə(r)] 清除 4.iterator 迭代器 学习目标: ...

  3. 李洪强漫谈iOS开发[C语言-008]- C语言重难点

      C语言学习的重难点 写程序的三个境界: 照抄的境界,翻译的境界,创新的境界 1  伪代码: 描述C语言的编程范式 范式: 规范的一种表示 对于C的范式学会的话,C, C++ Java 都会了 2 ...

  4. STM32 CAN总线标识符过滤器难点解析

    STM32 CAN总线标识符过滤器难点解析 原创 2016年05月31日 15:12:24 标签: stm32 / CAN 4910 CAN总线是目前应用非常多的一种总线,在汽车电子,航空航天中应用广 ...

  5. English--音标重难点

    English|音标重难点 在拥有了,音标的元音与辅音的基础之后,需要对于这些音标进行加以区分,毕竟方言对于口型的影响非常的大. 前言 目前所有的文章思想格式都是:知识+情感. 知识:对于所有的知识点 ...

  6. 这是一份非常适合收藏的Android进阶/面试重难点整理

    写在前面 记得我大二时“不务正业”地自学Android并跟了老师做项目,到大三开始在目前的公司实习,至今毕业已有几年多,学习Android已经6.7年多了!但总感觉知识点很零散,并且不够深入,遇到瓶颈 ...

  7. 《十天学会 PHP》的重难点

    记录一下我在学习<十天学会 PHP>(第六版)的过程中的遇到的重难点,该课程是学习制作一个简单的留言板. 准备工作 XAMPP(Apache + MySQL + PHP + PERL) 是 ...

  8. html和css的重难点知识

    目录 html总难点总结: 1. 块级标签与内联标签的区别 1.1 块级标签: 1.2 内联标签: 2. 选择器 2.1 定义 2.2 选择器的分类 2.1 选择器的分类 3. css中margin, ...

  9. 老猿Python重难点知识博文汇总

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 除了相关教程外,老猿在学习过程中还写了大量的学习随笔,内容比较杂,文章内容也参差不齐,为了方便,老猿 ...

随机推荐

  1. Protecting against XML Entity Expansion attacks

    https://blogs.msdn.microsoft.com/tomholl/2009/05/21/protecting-against-xml-entity-expansion-attacks/ ...

  2. word双栏排版,最后一页由于分节符造成最后一页是空白页,删除分节符双栏就变成了单栏

    遇到这个问题时,我们把心思都花在了如何“删除”这个空白页. 但是最有效的办法不是“删除”,而是(以word2007为例): Word 2007中文版: 鼠标放在最后一页,点击页面布局①,选择页面布局右 ...

  3. HTML之一语言代码

    HTML的lang属性可用于网页或部分网页的语言.这对搜索引擎和浏览器是有帮助的. 同时也可以是指HTTP Header中的Accept-Language/Content-Language. ISO ...

  4. window的cmd窗口运行git

    般情况下,我们在 Window 下安装好 git 后,在运行里面打开 cmd 窗口,在里面直接运行 git --version ,会提示“不是内部或外部命令,也不是一个可运行的程序”. 要想在cmd窗 ...

  5. 2017年php面试题汇总

    1.http状态码 200 这个没有什么好说的,是代表请求被正常的处理成功了 302 代表临时重定向 400 400表示请求报文中存在语法错误.需要修改后再次发送 403 表明请求访问的资源被拒绝了. ...

  6. MySQL中的EXPLAIN

    使用EXPLAIN加上SELECT语句可以获取优化器的查询执行计划 MySQL会在查询上设置一个标记,当执行查询时,这个标记会返回关于在执行计划中每一步的信息,而不是执行它.它会返回一行或多行信息,一 ...

  7. 使用Python统计函数绘制复杂图形matplotlib

    一.堆积图 1.堆积柱状图 如果将函数bar()中的参数bottom的取值设定为列表y.列表y1代表另一个数,函数bar(x,y1,bottom=y,color="r")就会输出堆 ...

  8. Winform开发框架中的综合案例Demo

    在实际的系统开发中,我们往往需要一些简单的的案例代码,基于此目的我把Winform开发框架中各种闪光点和不错的功能,有些是我们对功能模块的简单封装,而有些则是引入了一些应用广泛的开源组件进行集成使用, ...

  9. POJ 1035 Spell checker 字符串 难度&colon;0

    题目 http://poj.org/problem?id=1035 题意 字典匹配,单词表共有1e4个单词,单词长度小于15,需要对最多50个单词进行匹配.在匹配时,如果直接匹配可以找到待匹配串,则直 ...

  10. lrzsz 移植到 ARM-linux 嵌入式板子上

    特别说明:SSH 或 串口 都可以使用 lrzsz 进行通信 lrzsz是一个Unix通信包,提供XMODEM.YMODEM和ZMODEM文件传输协议.lrzsz以前是Omen科技的主打软件,现在已经 ...