文章目录
Lua 编程学习笔记
Lua编程语言给人的感觉是小巧,简洁,解释性语言,弱类型,主要用于游戏开发,嵌入式脚本开发。
此次学习源于写饥荒脚本,用饥荒学习Lua绝对是不错的一个实战。
一、环境安装
首先在官网下载
Lua下载是一个压缩文件,解压即可用,但是需要先编译一下。
默认是没有可执行程序的,需要使用命令制作一下。
在当前src
目录下打开终端窗口,执行命令
make
make
之后生成lua
和luac
两个可执行程序
这样我们就可以用Lua
这个可执行程序执行我们编写的.lua文件了。
我使用的是IDE是Idea,Idea需要编写Lua需要下载一个插件:EmmyLua
使用这个插件可以高亮显示还有方法提示,可以Tab键自动补全。
安装后运行Lua文件的需要配置文件的解释程序。
这样整体的开发环境就搭配好了。
二、Lua 基本语法
1. 注释
单行注释
-- Lua 的单行注释使用 `--`
print("Hello Lua")
多行注释
--[[
多行注释1
多行注释2
多行注释3
]]
print("Hello Lua")
2. 标识符
和其他编程语言一样,Lua的标识符由字母、数字以及下划线组成,且不能以数字开头,不能是关键字
比如:__index
3. 变量
Lua作为弱类型语言,变量的定义不需要声明数据类型。
-- 整数变量 a
a = 1
-- 字符串变量 a
a = "Test"
-- 布尔类型 a
a = false
变量的作用域默认是全局,只有声明为local
的变量才是局部变量
弱类型语言的变量使用很随意,如果变量的数据类型使用错误,只有在运行时才能发现,体现的是规范大于约定的思想。
4. 数据类型
虽然变量的定义不需要声明数据类型,但是Lua大体上还是分为8种数据类型
- nil
- number
- string
- boolean
- function
- table
- userdata
- thread
nil代表空值,被赋值为nil的变量将清空,userdata和thread目前还没接触,其他类型只有nil和table的概念比较特殊。
注:Lua中的布尔值只有nil和false为条件表达式的否判断。
-- number类型也是真值
a = 1
if a then
print("a是ture")
end
-- 函数类型也是真值
function fn()
print("fn函数")
end
if fn then
print("fn函数只要不为nil也是真值")
end
5. Lua 运算符
1)算术运算符
+
加法-
减法*
乘法/
除法(真实运算,不会取整数,Java里边10/3=3,这里10/3=3.3333333333333)%
求余^
幂运算( 2^3=8.0)-
负号,对数字前面直接加取负数//
整数运算,这个才是同Java的除法运算,10/3=3
2)逻辑运算符
- and 逻辑与运算
- or 逻辑或运算
- not 逻辑非运算
3)关系运算符
>
<
==
>=
<=
~=
注意Lua的不等于写法~=
这个还是挺新鲜的写法。
4)其他运算符
Lua 没有类似++
, --
的操作,循环时候一定要注意!
..
拼接字符串,同Java的 + 拼接字符串#
返回字符串或者表的长度
print(#"Hello") -- 输出 5
tab = {
1,2,3}
print(tab) -- 输出3
三、循环与流程控制
Lua循环和其他语言类似,只是需要注意基本的格式。
1. 循环
三种循环方式
- while
- for
- repeat … until
-- 方式一 while 循环
a = 0
while a < 10 do
print("while循环"..a)
a = a + 1
end
-- 方式二 for 循环
for i = 1, 10 do
print("for循环"..i)
end
-- 方式三 repeat 循环
c = 0
repeat
print("repeat循环"..c)
c = c + 1
until c > 10
repeat … until 循环好比是Java中的 do…while循环,至少执行一次。
2. 流程控制
-- if 结构
if a>b then
return a
end
-- if elseif else 结构
if a > 90 then
print("优秀")
elseif a > 80 then
print("良好")
elseif a > 60 then
print("及格")
else
print("不及格")
end
循环和流程控制都没有特殊的,需要注意的是基本格式,Lua里边无论函数还是循环控制,都是以end结尾
四、函数
Lua函数比较特殊,第一次遇到可以返回多个值。
1. 基本定义
-- 方式一
function f1()
-- do something
end
-- 方式二
local f2 = function(arg1,arg2,arg3)
-- do something
return arg1,arg2,arg3
end
Lua的函数修饰符只有local
定义是否为局部函数,参数可选。主要是可以类似函数f2,可以返回多个数据。
接收函数返回值的时候也可以多个变量一一对应接收。
function f3()
return 1,2,3
end
a,b,c = f3()
print(a,b,c) -- 输出 1,2,3
2. 可变参数
函数接收可变参数有个内置变量arg这个需要主要,他是一个表table
-- `...` 代表可变参数
function f4(...)
local arg = {
...}
-- 遍历方式一
for k, v in pairs(arg) do
print(k,v)
end
-- 遍历方式二
for k, v in ipairs{
...} do
print(k,v)
end
print(#arg) -- 定义 local = {...} 可通过 #arg 获取参数个数
print(select("#",...)) -- select("#",...) 获取可变参数个数
end
f4(1,2,3,4) -- 最后打印 4
-- 函数作为参数传递
function f5(func)
local ret = func
end
注:可变参数的获取方式和数据获取方式是重点
另外,ipairs和pairs的主要区别是ipairs遇到nil则会停下来,而pairs遍历不会。
for k,v in pairs(table) do … end 这是一种基本固定的遍历表的写法,类似Java中的增强for循环。
3. 函数作为参数传递
函数作为参数传递给下个函数时,函数内可以调用这个函数做一些数据处理
function max(a,b)
if a > b then
return a
else
return b
end
end
function printMax(a,b,maxFunc)
print(maxFunc(a,b))
end
printMax(2,3,max)
五、表与数组
表是Lua中最常用的数据结构了,基本上数据的使用都是通过表,但我理解更像是一个Map容器,存储一些key,value的键值对。
1. 基本定义
-- 数组没有单独的表示方式,数组就是用表表示的,只不过没有key,默认key就是1,2,3...连续索引
-- 一对花括号就代表这是一个表,前面的数据类型有一个就是table表数据类型
tab = {
}
-- 也可以初始化(数组)
fruits = {
"apple","peach","banana"}
-- 这个更应该被认为是表,以指定的key-value形式存在
table_defin