文章目录
1 Lua简介
参考文章
Lua1.x
对于学术用途是免费的,但是商业用途则需要协商
Lua2.x
table作为对象和类的基础,table索引,算术操作符,字符串拼接,顺序比较,函数调用, Lua作为无限制免费软件发布,
Lua3.x
我们解决了fallback冲突问题。我们将fallback替换为tag方法:钩子是以(event, tag)的形式挂在字典里的。
…
- Lua应用场景:游戏开发,独立应用脚本,扩展和数据库插件,安全系统
2 Lua编程工具

第一个Lua程序
Lua开发工具LuaEdit下载
lua开发工具安装教程

3 起点
3.1 编程方法
lua [options] [script [args]]
-e:直接将命令传入Lua
prompt> lua -e "print(math.sin(12))" --> -0.53657291800043
-l:加载一个文件.
-i:进入交互模式.
_PROMPT内置变量作为交互模式的提示符
prompt> lua -i -e "_PROMPT=' lua> '"`
lua>
Lua的运行过程,在运行参数之前,Lua会查找环境变量LUA_INIT的值,如果变量存在并且值为@filename,Lua将加载指定文件。如果变量存在但不是以@开头,Lua假定filename为Lua代码文件并且运行他。利用这个特性,我们可以通过配置,灵活的设置交互模式的环境。可以加载包,修改提示符和路径,定义自己的函数,修改或者重命名函数等。
全局变量arg存放Lua的命令行参数。
prompt> lua script a b c
在运行以前,Lua使用所有参数构造arg表。脚本名索引为0,脚本的参数从1开始增加。脚本前面的参数从-1开始减少。
prompt> lua -e "sin=math.sin" script a b
arg表如下:
arg[-3] = “lua”
arg[-2] = “-e”
arg[-1] = “sin=math.sin”
arg[0] = “script”
arg[1] = “a”
arg[2] = “b”
交互式编程,在控制台交互界面直接输入lua代码运行:

脚本式编程,通过调用lua文件,使lua文件中的代码直接运行:

开发工具编程,在Lua开发工具里进行编译,开发工具里可以对代码进行调试,方便上手:

3.2注释
单行注释
-- 单行注释
多行注释
--[[
多行注释
多行注释
]]--
3.3关键字(21个)
| and | break | do | else |
|---|---|---|---|
| elseif | end | false | for |
| function | if | in | local |
| nil | not | or | repeat |
| return | then | true | until |
| while |
3.4 标识符
注:lua是大小写敏感的,比如a和A是两个不同的标识符
标识符:用于定义一个变量,函数获取其他用户定义的项目,以字母(a-z或A-Z)或者 下划线_ 开头的字母、下划线、数字序列。
4 数据类型和值
Lua是动态类型语言,变量不要类型定义。变量没有预定义的类型,每一个变量都可能包含人一种类型的值。Lua中有8个基本类型分别是nil,boolean,number,string,userdata,function,thread和table,函数type可以测试指定变量或者值的类型。


一般情况下同一变量代表不同类型的值会造成混乱,最好不要用,但是特殊情况下可以带来便利,比如nil
4.1 nil
一个取值nil;一个全局变量没有被赋值前为nil,给全局变量赋nil可以删除该变量
4.2 boolean
两个取值false和true。在控制结构中除了false和nil为假,其他的值都为真。比如0和空串都是真
4.3 number
表示实数,Lua中没有整数。数据常量的小数部分和指数部分都是可选的,数据常量的例子:
4 0.4 4.57e-3 0.3e12 5e+12
4.4 string
字符的序列,lua是8位字节,所以字符串可以包含任何数值字符,包括嵌入的0。意味着你可以存储任意的二进制数据在一个字符串里。Lua中字符串是不可以修改的,你可以创建一个新的变量存放你要的字符串,如下:
string和其他对象一样,Lua自动进行内存分配和释放,一个string可以只包含一个字母也可以包含一本书,Lua可以高效地处理长字符串,1M的string在Lua中很是常见的。可以使用单引号或者双引号表示字符串,也可以使用[[]]间的字符表示字符串,最好使用一种,除非两种引号嵌套情况,
a = "a line"
b = 'another line'
可以通过#来计算字符串的长度,放在字符串前面
- 转义字符
\a 响铃(BEL)
\b 退格
\f 换页
\n 换行
\r 回车
\t 水平制表tab
\v 垂直指标
\\ 反斜线字符\
\" 双引号字符
\' 单引号字符
\ddd 1到3位八进制数所代表的任意字符
\xhh 1到2位十六进制所代表的任意字符
4.5 table
table的创建是通过构造表达式来完成,最简单的构造表达式是{},用来创建一个空表。
local tb1 = {}
local tb2 = {
"yu","an","rui"}
table其实是一个关联数组,数组的索引可以是数字也可以是字符串(相当于map)
a = {}
a["key1" ]= "v1"
a[1] = 22;
a[1] = a[1]+11;
for k,v in pairs(a) do
print(k,":",v)
end
-- key1:v1
-- 1:33
Lua里表的默认初始索引一般以1开始
local tb2 = {
"yu","an","rui"}
for k,v in pairs(tb2) do
print(k,v)
end
--1yu
--2an
--3rui
4.6 function
函数可以存在变量里
function say(n)
print(n)
end
say2 = say
say2(10)
函数可以以你们函数的方式作为参数传递
function test(t1,fun)
for k,v in pairs(t1) do
print(fun(k,v))
end
end
tab = {
"a","b"}
test(tab,
function(key,val)
return key .. " = ".. val
end
);
4.7 thread
线程和协程的区别:线程可以同时多个运行,而协程任意时刻只能运行一个
- lua里,最主要的线程是协同程序。和线程差不多,拥有自己独立的栈,局部变量和指令指针,可以跟其他协同程序共享全局变量和其他大部分东西。
4.8 userdata
userdata是一种用户自定义数据,用于表示一种由应用程序或c/c++语言库所创建胡类型,可以将任意c/c++的任意数据类型的数据(通常是struct和指针)存储到Lua变量中调用。
5 变量
变量有三种里类型:全局变量,局部变量,表中的域
默认情况下,变量总是认为是全局的,全局变量不需要声明,给一个变量赋值后即创建了全局变量,访问一个没有初始化的全局变量也不会出错,只不过得到的结果是nil。如果你想删除一个全局变量,只需要讲变量赋值为nil。
用local显式声明为局部变量,局部变量的作用域为从声明位置开始到所在语句块结束。变量的默认值为nil。访问局部变量胡速度比全局变量更快
6 表达式(运算符)
- 算术运算符:
+ - * / ^ % - 关系运算符:
< > <= >= == ~= - 逻辑运算符:
and or not - 连接运算符:
..
字符串连接,如果操作数为数字,Lua将数字转成字符串。
print("Hello " .. "World") --> Hello World
print(0 .. 1) --> 01
- 其他运算符:
#
返回字符串或表的长度
print(#"Hello") --->5
- 运算符优先级
从高到低。
^
not - (unary)
* /
+ -
..
< > <= >= ~= ==
and
or
其中除了^和…外所有的二元运算符都是左连接的
x^y^z <--> x^(y^z)
7 基本语法
7.1 赋值语句
- 赋值改变一个变量的值和改变表域的最基本方法
a = "hello" .. "world"
t.n = t.n+1
- 多个变量同时赋值
a,b = 10,2*x <--> a=10; b=2*x
遇到赋值语句Lua先计算右边所有的值然后再执行赋值操作,这样我们就可以进行交换变量胡值
- 多变量赋值,数和值的个数不一致
值个数不足够,补nil;变量个数不足,多余的值会被忽略 - 多值赋值经常用来交换变量,或将函数调用返回给变量
a, b = f() --f()返回两个值,第一个赋给a,第二个赋给b。
7.2 控制结构语句
控制结构的条件表达式结果可以是任何值,Lua认为false和nil为假,其他值为真
- if语句-三种形式
if conditions then
then_part
end
if conditions then
then_part
else
else_part
end
if conditions then
then_part
elseif conditions then
elseif_part
.. -->多个elseif
else
else_part
end
- while语句
while conditon do
statements;
end
- repeat-untile语句
repeat
statements;
until conditons;
- for-两大类语句
第一 ,数值for循环
for var = exp1,exp2,exp3 do
loop-part
end
for将用exp3作为stept从exp1到exp2,执行loop-part.其中exp3可以省略,默认step=1
有几点需要注意:三个表达式只会在循环前计算一次;控制变量var是局部变量自动被声明,并且只能在循环内有效;循环过程中最好不要改变控制变量的值。
第二,范式for循环
iparis一般用来遍历数组从1,2…;paris一般用来遍历表(键值对),它也可以遍历数组,数组实质上就是键为1,2…的,元素为值的表;如果表的元素里从1,2连续开始的,也可以使用ipairs访问1,2…等的键值对。

最低0.47元/天 解锁文章
1471

被折叠的 条评论
为什么被折叠?



