Lua基础语法学习笔记
Lua是一门语言,我们可以使用一个库,可以在运行时去编译执行Lua中的代码,从而实现自己的内存中的数据和逻辑;
准备学习环境:
新建一个Lua项目目录,用来写我们的Lua代码;
进入目录,右键使用vsCode打开 或者,先打开vsCode,然后 文件->打开文件夹 ,选择我们的项目目录;
为vsCode安装Lua相关的插件Lua(Lua Language Server coded by Lua)
和LuaDebug
插件
执行Lua
按Ctrl + J,打开控制台,输入命令:Lua 文件名.Lua
local:
代表变量,只能在当前chunk(块)中访问到
不加local的变量:
代表变量,默认情况下是全局可以访问
数字 :整数和浮点数 都是number类型
函数:
重点是得理解,函数的定义,和函数的执行 是两码事
定义,只是在内存中生成了这个函数对象
执行,才是真正去执行函数中代码
块(Chunk)
可以认为是是一个局部的环境;一个函数就是一个块,一个Lua脚本(模块)就是一个块;do .. end 也是一个块
local 只能在当前块中访问
访问的变量不存在时,不会报错,而是把这个变量当前nil处理
表:
可以把表当成一个容器,这个容器由两部分组成,字典和list
表里可以放任何东西
没有键的数据,会放到list中,有键的放到字典中;key,可以是任何类型除了nil以外
如果key是数字必须 这样写:t={[3]=4}
Lua中,数组是从1开始索引的,不是从0开始的
遍历表
使用ipairs
遍历 数组部分
数组部分的元素会被nil截断;ipairs
会无法遍历nil以后的数据
#
可以获取数组的长度,但是如果倒数第二个索引为nil,那么#就不会获取最后这两个数据的长度了
所以,不要使用nil来删除数组中的元素
使用table库来操作表
使用pairs
遍历 所有数据
字典部分,如果值为nil,就相当于删除了这个数据
访问一个变量时,先查询 当前块中的局部变量,如果查询 不到,会查询 上一级(upValue)中的该变量,依次类推,直到查询到全局变量为止;
Lua中没有+=
使用~=
代替!=
使用 not
and
or
代替 !
&&
||
先计算not再计算and,最后是or
在Lua中,false和nil,都当作false做逻辑运算
io.read
(获取键盘输入)和多重返回值
数据类型:
在Lua中,只有table和字符串,是引用类型;
number是双精度的实浮点型
闭包:
当一个内部函数,引用了外部函数的一个局部变量时,那么就会形成闭包;
因为这个局部变量,不会再被外界访问到;只有该函数自己可以访问;
可以理解为,每个函数对象定义时,会有一个上值(环境表),这个上值中,会储存这个函数所引用的数据;
元表:
Lua中每个对象都可以有个元表,也可以没有;我们现在关注表的元表就可以了;
setmetatable(设置元表)
getmetatable(访问元表)
可以使用t.name直接访问表t中name的key,不需要 t["name"]
元方法:
在元表中方法,以__
开头的方法,都是元方法
元方法,是Lua内置定义的名字,你不能自己定义
__index
:当你访问一个表t1不存在的key时,会查询 t1的元表t2中的__index
指向的方法
__newindex
:当你写入一个表t1不存在的key时,会调用t1的元表t2中的__newindex
指向的方法
模块:
在Lua中,一个Lua文件对应的块,就是模块
可以使用require
去加载模块到内存中
require
返回的是模块最后return
的结果,默认返回true
require
一个模块多次,模块中的代码,只会执行一次,并且会返回之前require
的结果
local
只能在当前块中访问,模块也是一个块儿
总是需要一个入口模块来启动Lua,有点像我们C#中的Main函数的作用
面向对象
使全局变量定义一个对象,并且在方法内部使用这个全局变量引用这个变量,会造成强关联
我们可以定义方法时,将对象本身作为第一个参数传入,在函数内部使用这个参数去操作对象
语法糖
function Account:WithWindow1(v)
self.balance = self.balance - v
end
当给一个表使用冒号定义一个方法时,相当于自动为该方法添加了一个self作为形参
Account:WithWindow1(100)
当一个表使用冒号来调用一个方法时,相当于把自己作为第一个参数,传到方法中使用
类
对象将元表设为自己的类表,类表的index
指向本类表;那么将来访问对象的方法时,就会访问到这个类表中的方法
静态方法
当类表作为调用者时,这个方法就是静态的方法,静态方法和实例方法在表示上没有区别
Lua基础语法学习笔记的更多相关文章
- Python 基础语法学习笔记
以下运行结果均通过Python3.5版本实测! 1.列表转换为字典 a = ['a', 'b'] b = [1, 2] c = ['c','d'] print (dict([a,b,c])) 输出结果 ...
- 毕业设计 之 五 PHP语法学习笔记
毕业设计 之 四 PHP语法学习笔记 作者:20135216 平台:windows10 软件:XAMPP,DreamWeaver 说明:该笔记是对网站编程语言的详细学习 一.PHP基础 0. 关于环境 ...
- Objective-c基础知识学习笔记
Objective-c基础知识学习笔记(一) 一直有记录笔记的习惯.但非常久没分享一些东西了,正好上半年開始学习IOS了,如今有空写点.因开发须要,公司特意为我们配置了几台新MAC.还让我们自学了2周 ...
- Golang 语法学习笔记
Golang 语法学习笔记 包.变量和函数. 包 每个 Go 程序都是由包组成的. 程序运行的入口是包 main. 包名与导入路径的最后一个目录一致."math/rand" 包由 ...
- Swift基础语法学习总结(转)
Swift基础语法学习总结 1.基础 1.1) swift还是使用// 和/* */ 来注释,并且/* */允许多行注释. 1.2) swift使用print和println打印,它的传参是一个泛型 ...
- Swift基础语法学习总结
Swift基础语法学习总结Swift高级语法学习总结Swift语法总结补充(一) 1.基础 1.1) swift还是使用// 和/* */ 来注释,并且/* */允许多行注释. 1.2) swift ...
- MarkDown语法 学习笔记 效果源码对照
MarkDown基本语法学习笔记 Markdown是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式. 下面将对Markdown的基本使用做一个介绍 目 ...
- linux基础命令学习笔记(二)
linux基础命令学习笔记(二) 1.kill :终止进程 kill pid (唯一标示一个进程) kill -9 强制终止 kill -15 命令未结束不能终止 # ps aux 查看所有进程 ...
- Python 基础语法学习(第一讲)---类的使用
[写在前面]:其实自学python有一段时间了,但是一直没想起来要写博客来记录自己的学习,今天才感觉要写点什么让自己学的更扎实一点,所以从今天开始更新python自学系列,希望看见文章的大佬们可以指点 ...
- Java基础语法学习
Java基础语法学习 1. 注释 单行注释: //单行注释 多行注释: /*多行注释 多行注释 多行注释 多行注释 */ 2. 关键字与标识符 关键字: Java所有的组成部分都需要名字.类名.变量名 ...
随机推荐
- react+antd pro实现【列表可实时行内编辑】的弹窗表单组件
纯列表版效果展示: ① 初始无值,展示为唤醒按钮+文案外链 ②点击按钮唤醒弹窗(简易版示意图) ③配置后 可编辑表格组件文档: https://procomponents.ant.design/com ...
- Vue中的样式穿透,修改element-ui组件样式不生效
在Vue项目中用的比较多的就是组件,为了实现组件的样式模块化.我们通常会在style标签中添加一个scoped属性,这样css样式只能作用于当前的Vue组件.使组件之间的样式相互独立,当调用该组件的时 ...
- Jmeter一、开源软件的崛起
一.jmeter自身特点: 1.开源,轻量级,更适合自动化和持续集成. 2.学习难度大. 3.资料少.多英文. 二.性能测试工具选型的原则 1.成本: a.工具成本 b.学习成本 2.通信协议: a. ...
- Jmeter-接口测试(一)
一.接口测试分类 内部接口 外部接口--被测系统调用外部 --系统对外部提供的接口 接口测试重点:接口参数传递的正确性.接口功能的正确性.输出结果正确性.各种异常容错处理.权限控制.分页.调用 ...
- re相关正则表达式(re.sub、re.I 、re.S、re.M)
re.I 表示忽略大小写 re.S 表示全文匹配 re.M 表示全文拼配行尾段位的字符或者数字,影响^和$ re.sub 表示替换 使用方法: re.sub(pattern, repl, string ...
- Idea项目构建时解决方法
java.lang.OutOfMemoryError: Java heap space java.lang.OutOfMemoryError: GC overhead limit exceeded 整 ...
- C# Http 服务器get pos 请求 获取头信息 iOS 客户端联调
using System; using System.Collections.Generic; using System.IO; using System.Net; using System.Text ...
- 调用mglearn时的报错 TypeError: __init__() got an unexpected keyword argument 'cachedir'
import mglearn的时候发生的报错 原因是调用了joblib包中的memory类,但是cachedir这个参数已经弃用了 查到下面帖子之后改掉cachedir解决问题 https://blo ...
- SQL数据库和语法
增删改查 SELECT prod_id, prod_name, prod_price FROM Products; SELECT * FROM Products; //增 INSERT INTO Cu ...
- shell编程【一】
参考网址:[Linux命令大全][]:https://linux265.com/course/linux-commands.html 为什么要学习shell指令? 学习shell指令的本身也是在了解L ...