目录
[TOC]
1 简介
Lua是C语言
开发的轻量脚本语言
,以源代码
形式开放。
设计的目的是,嵌入到应用程序中
,为应用程序提供灵活的扩展
和定制
功能。
官网:
中文参考手册:
https://www.runoob.com/manual/lua53doc/contents.html
2 安装
2.1 网页运行地址
官方demo地址,这在网页运行脚本:
https://www.lua.org/cgi-bin/demo
2.2 linux安装
- 安装依赖
yum install libtermcap-devel ncurses-devel libevent-devel readline-devel
- 下载编译安装
#下载
wget http://www.lua.org/ftp/lua-5.3.5.tar.gz
#解压
tar -xzvf lua-5.3.5.tar.gz
#切换目录
cd lua-5.3.5
#编译
make linux
#安装
make linux install
-
校验
-
查看明了文件
/usr/local/bin目录下会出现执行文件:lua、luac。
-
查看当前版本
[root@localhost /]# lua -v Lua 5.3.5 Copyright (C) 1994-2018 Lua.org, PUC-Rio
-
简单命令测试
[root@localhost /]# lua Lua 5.3.5 Copyright (C) 1994-2018 Lua.org, PUC-Rio > print('hello world') hello world >
-
2.3 windows安装
2.3.1 安装LuaForWindows
- 下载地址
https://github.com/rjpcomputing/luaforwindows/releases
-
配置SciTE
-
代码提示
Options->Open User Options File,增加如下配置:
# 增加代码提示功能( 当按下句点 '.', 以及字母键的时候, 弹出自动完成提示。) autocomplete.*.start.characters=.$(chars.alpha)
-
-
支持中文
#支持中文字符++++++++++++++++++++++++++++ #支持中文 963表示简体中文 code.page=936 output.code.page=936 #不启用的话,在输出区中文可能会乱码 character.set=134
2.3.2 Idea安装插件
idea选择插件EmmyLua
,进行安装。
新建项目时,项目类型选择Lua
。
2 编程方式
代码不需要以;结尾
,区分大小写。
-
交互式编程
可通过lua控制台,输入程序,查看结果。
-
脚本式编程
编写lua脚本*.lua,执行脚本查看结果。
3 注释
3.1单行注释
-- 单行注释
3.2 多行注释
--[[
多行注释1
多行注释2
]]
3 数据类型
8种数据类型,通过关键字type
可查看数据类型。
function fun1()
-- function body
end
print(type(123),type('tom'),type({}),type(fun1));
执行结果:
number string table function
3.1 nil
nil表示空,没有值。if判断中nil和false都属于false
,0为true
。
使用未定义的变量时,结果为nil,删除变量时,也通过赋值为nil实现。
3.2 boolean
布尔类型,有两个值,true和false。
3.3 string
字符串类型,可用单引号或双引号
表示字符串。
字符串拼接使用..
,如下:
print('123'..'456')
执行结果为:
123456
3.4 number
双精度浮点数,8个字节。
3.4.1 隐式转换
通过运算,string转换number
字符类型的变量执行数字运算,如字符串中的内容均为数字,则执行结果的类型为number
,如下:
a,b='123','456'
c=a+b
print(c)
print(type(a),type(b),type(c))
执行结果:
579
string string number
如字符串执行数字运算,字符串中的内容不为数字,则执行报错
a,b='123','abc'
c=a+b
print(c)
print(type(a),type(b),type(c))
执行结果:
lua.exe: test1.lua:2: attempt to perform arithmetic on global 'b' (a string value)
stack traceback:
test1.lua:2: in main chunk
3.5 table
table(表),是lua中灵活的数据结构,可以用来创建自己的数据结构,类似于java中的map。table有类似map的key和map。
3.5.1 初始化
同一个table中,key既可以为数字,也可以为字符串,value可以为任意类型
。
-
构建list
tab={'tom','jack'} for k,v in pairs(tab) do print(type(k),type(v),k,v) end
结果如下:
number string 1 tom
number string 2 jack -
构建map
tab={name='tom',age=18} for k,v in pairs(tab) do print(type(k),type(v),k,v) end
结果如下:
string string name tom
string number age 18 -
混合构建
tab={'tom',name='zhangsan','jack',age=14} for k,v in pairs(tab) do print(type(k),type(v),k,v) end
number string 1 tom
number string 2 jack
string string name zhangsan
string number age 14
3.5.2 设置获取值
table中代表列表key索引值从1开始,而不是从0开始
。
key只能为数字或字符串。如table为tab1,
当key为数字时,获取key对应的内容为:tab[1]
,设置key的值为:tab[1]=xxx
;
当key为数字或字符串时,获取key对应的内容为tab['myKey']
、tab.myKey
,设置key的值为:tab['myKey']=xxx
、tab.myKey=xxx
3.6 function
3.6.1 格式
格式:
optional_function_scope function function_name( argument1, argument2, argument3..., argumentn)
function_body
return result_params_comma_separated
end
参数说明:
optional_function_scope: 该参数是可选的制定函数是全局函数还是局部函数,未设置该参数默认为全局函数,如果你需要设置函数为局部函数需要使用关键字 local。
function_name: 指定函数名称。
argument1, argument2, argument3..., argumentn: 函数参数,多个参数以逗号隔开,函数也可以不带参数。
function_body: 函数体,函数中需要执行的代码语句块。
result_params_comma_separated: 函数返回值,Lua语言函数可以返回多个值,每个值以逗号隔开。
举例:
function funTest()
-- function body
end
3.6.2 参数
参数可以为定长参数,也可以为变长参数。
-
定长参数
function funTest(name,age) print(name,age) end funTest('tom',14)
输出结果:
tom 14
-
变长参数
变长参数,函数定义时用
...
来表示。函数内部,通过
{...}
获取变长参数,获取的结果类型为table
。函数内部,可以通过
select
关键字获取可变参数的相关信息。select('#'...)
表示获取可变参数的长度;select(n,...)表示获取第n个
到第select('#',...)
个的参数结果
,获取的内容为一组返回值,获取的类似function返回的多个值
,而不是table。 -
举例:
--定义函数 function funTest(...) print('[参数类型]:'..type({...})) print('[参数个数]:'..select('#',...)) for v,k in pairs({...}) do print(v,k) end print('[select循环参数]:') for i=1,select('#',...) do local val=select(i,...) print(i,val) end end --调用函数 funTest('tom',14,'remark')
输出结果:
[参数类型]:table
[参数个数]:3
1 tom
2 14
3 remark
[select循环参数]:
1 tom
2 14
3 remark
3.6.3 返回值
函数可以有多个返回值
,如下:
--定义函数
function funTest()
return 'tom',14,'remark'
end
--调用函数
a,b,c,d=funTest();
print(a,b,c)
执行结果:
tom 14 remark
3.6.4 First-Class Value
第一函数值,函数名和变量名之间没有区别,他们之间可以互相赋值
。
function fun1()
print("fun1")
end
a=123
print(a)
a=fun1
print(a
执行结果:
123
function: 00C6BC40
3.6.5 匿名函数
函数支持匿名函数,类似java中的匿名函数。
function fun1(name,printFun)
printFun(name)
end
fun1("tom",function(myName)
print(myName .. ' is call')
end)
执行结果:
tom is call
3.7 thread
线程相关,待完善。
3.8 userdata
C语言结构相关,待完善。
4 变量
4.1 作用范围
默认情况下,所有变量均为全局变量
,如将变成设置为局部变量,变量前需加local
关键字,如下:
local userName='tom'
4.2 命名规则
- 变量命名,可以有字母、数字。下划线
- 只可以以字母、下划线开头定义变量。不可以以数字开头,不建议以
_
+大写字母
开头,否则容易和lua内部变量冲突(lua内部变量采用此命名规则) - 不可以用关键字作为变量
4.3 类型
变量类型可以根据变量的值确定
。同一个变量多次赋值不同类型的数据后,变量类型发生变化。
执行代码:
a='tom'
print(a)
a=123
print(a)
执行结果:
tom
123
4.4 赋值
-
为多个参数赋值
可以一次性给多个参数赋值。类似
prarm1,param2,parma3=value1,value2,value3
会依次将=号右边的值
按照顺序依次
赋值给左边的变量。=号``两侧的数量可以不一致
,当变量个数比值的个数多时,后面多余的变量自动赋值为nil(相当于没有定义该变量
),当变量的个数比值的个数少的时候,多余的赋值,将忽略。 -
执行顺序
lua中对参数赋值时,先将=号右面的内容计算完毕后,再赋值给左边。
因此,交换变量内容时,可以写作:
a,b=123,456 print(a,b) a,b=b,a print(a,b)
执行结果:
123 456
456 123
4.5 删除
获取没有定义的变量,内容为nil。变量直接赋值为nil,则将变量删除。
如果给变量赋值为nil,和变量未初始化,效果一样。
执行代码:
-- 调用未定义的变量
print(a)
-- 变量赋值
a='tom'
print(a)
-- 删除变量
a=nil
print(a)
执行结果:
nil
tom
nil
4.6 值传递/引用传递
值传递
:变量之间赋值,将老变量的内容拷贝了一份给新的变量。新的变量更改内容不影响老的变量。
引用传递
: 变量之间的赋值,将老的变量对内容的引用传递给信的变量,新老变量对应的内容内存地址一致,新的变量和老的变量更改内容,均会影响对方。
lua变量赋值,table为引用传递,其他均为值传递
。
-
值传递
a=123 b=a b=456 print(a,b)
执行结果:
123 456
-
引用传递
function printTable(tab) for k,v in pairs(tab) do print(k,v); end end a={name="tom",age="18"} b=a printTable(a) printTable(b) b.name='jerry' print('===============after change===============') printTable(a) printTable(b)
执行结果:
name tom
age 18
name tom
age 18
===============after change===============
name jerry
age 18
name jerry
age 18
5 流程
5.1 循环
5.1.1 for循环
-
数值for循环
数值for循环,根据条件判断指定的循环次数,每次循环执行对应循环体。
主要用来指定循环次数,exp1,exp2如果为公式,只执行一次。
- 格式
for var=exp1,exp2,exp3 do -- <执行体> end
var 从exp1变化到exp2,中间每次变化的步长为exp3。exp3可以省略,默认为1。
- 具体
-
泛型for循环
泛型for循环,主要用来遍历table。
格式:
for k,v in pairs(table1) do -- <执行体> end
其中,k为table的键,v为table的值。
循环会过滤掉值为nil的key(table中key对应的值为nil,表示key不存在)
,如下:function printTable(tab) for k,v in pairs(tab) do print(k,v); end end tab1={name="tom",remark=nil,age=18,other=nil} printTable(tab1)
执行结果如下,会忽略掉值为nil的键,remark和other:
age 18
name tom
5.1.2 while循环
-
格式
while(condition) do -- <执行体> end
根据条件condition判断是否执行。
5.2 if判断
if条件判断,可以进行嵌套
。
-
if语句
if(布尔表达式) then --[ 在布尔表达式为 true 时执行的语句 --] end
-
if...else语句
if(布尔表达式) then --[ 布尔表达式为 true 时执行该语句块 --] else --[ 布尔表达式为 false 时执行该语句块 --] end
-
if...
elseif
...else 语句if( 布尔表达式 1) then --[ 在布尔表达式 1 为 true 时执行该语句块 --] elseif( 布尔表达式 2) then --[ 在布尔表达式 2 为 true 时执行该语句块 --] elseif( 布尔表达式 3) then --[ 在布尔表达式 3 为 true 时执行该语句块 --] else --[ 如果以上布尔表达式都不为 true 则执行该语句块 --] end
6 模块
6.1 用途
6.2 举例
定义文件myModule.lua
:
-- 定义私有表
local myModule={name='tom'}
local function getResult(param)
-- 私有方法
return myModule.name .. ' say:' .. param
end
function myModule:say(param)
-- 公有方法
print(getResult(param))
end
-- 返回表
return myModule
调用:
myModule=require('myModule')
myModule:say('hello')
执行结果:
tom say:hello
6.3 加载机制
...
网友评论