1.lua的设计目的
其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。
2.lua的特点
- 轻量级: 它用标准C语言编写并以源代码形式开放,编译后仅仅一百余K,可以很方便的嵌入别的程序里。
- 可扩展: Lua提供了非常易于使用的扩展接口和机制:由宿主语言(通常是C或C++)提供这些功能,Lua可以使用它们,就像是本来就内置的功能一样。
- 支持面向过程(procedure-oriented)编程和函数式编程(functional programming)
- 自动内存管理;只提供了一种通用类型的表(table),用它可以实现数组,哈希表,集合,对象;
- 语言内置模式匹配;闭包(closure);函数也可以看做一个值;提供多线程(协同进程,并非操作系统所支持的线程)支持;
- 通过闭包和table可以很方便地支持面向对象编程所需要的一些关键机制,比如数据抽象,虚函数,继承和重载等。
3.关键字
以下列出了 Lua 的保留关键词。保留关键字不能作为常量或变量或其他用户自定义标示符:
and | break | do | else |
elseif | end | false | for |
function | if | in | local |
nil | not | or | repeat |
return | then | true | until |
while | goto |
一般约定,以下划线开头连接一串大写字母的名字(比如 _VERSION)被保留用于 Lua 内部全局变量,所以尽量不要下划线开头加大写字母定义变量。
4.全局变量
变量一般默认全局
定义变量时必须赋值,否则会报错!!!
你可以理解为,lua的赋值就是创建变量
如果你想删除一个全局变量,只需要将变量赋值为nil,换句话说, 当且仅当一个变量不等于nil时,这个变量即存在。
5.一些使用案例和类型介绍
print("nima")
--输出
--nima
--lua是解释性语言,一行一行编译运行
--单行注释
--[[多行注释]]--
--lua变量由字母、数字、下划线构成,数字不能作为开头
--尽量不要用下划线+大写字母形式命名
--不允许采用特殊字符命名 如¥@
--lua区分大小写
--lua关键字
--与 或 非 and or not
--if else elseif
--for循环 while循环 repeat until循环
--对错 true false
--[[
函数定义 没有大括号
function end
in local nil break then return
]]--
--lua只有八大数据类型
--nil 空 表示一个无效值(在条件表达式中相当于false)
print(type(nil))
--输出
--nil
--bool 布尔类型
--特别注意:
--[[
nil和false为假
其他全为真,0也表示真
]]--
--true false
print(type(false))
print(type(true))
--输出
--boolean
--boolean
--number数字类型
--lua中所有数字类型整型、浮点型都是number类型
--精度默认是双精度
print(type(1))
print(type(1e+1))
print(type(1.2535))
--输出
--number
--number
--number
--string字符串
--lua中双引号、单引号或者双中括号都是字符串
print(type("abc"))
print(type('abc'))
print(type([[abc]]))
--拼接输出
print("a".."b")
--输出长度
print(#"abc")
--输出
--string
--string
--string
--ab
--3
--函数function
--[[
function 函数名(参数列表)
函数体
end
]]--
function function_name()
print("a".."b")
end
--调用
function_name()
--输出类型
print(type(function_name))
--输出
--ab
--function
--table 表 唯一的数据结构 (只有表有中括号{})
print(type({}))
--输出
--table
--比较少用的两种:
--userdata 自定义数据类型
--用于表示与C/C#/C++交互时所产生的数据集
--thread 线程
--定义变量
--变量是什么类型却决于赋值的类型
--且没有重定义的错误,可理解为覆盖
a=10
print("a的类型"..type(a))
a=true
print("a的类型"..type(a))
a=function_name
print("a的类型"..type(a))
--输出
--a的类型number
--a的类型boolean
--a的类型function
--全局变量 局部变量 表中的域
--lua中定义的变量默认是全局变量
--lua中定义的变量默认是全局变量,除非加local显式声明为局部变量
a=5--全局变量
function Test()
b=3;--全局变量
local c=0--局部变量
end
print(b,c)
--输出
--nil nil
Test()
print(b,c)
--输出
--3 nil
--赋值语句
--改变一个变量的值或者改变表域的基本方法
c=4
--多变量赋值
--多变量赋值,变量列表和值列表各个元素用逗号隔开,
--赋值语句右边的值会依次赋值给左边的变量
a,b=1,2
print(a,b)
--输出
--1 2
--交换两个变量的值
a,b=b,a
print(a,b)
--输出
--2 1
--当变量的个数和值的个数不一致时
--1.变量个数大于值的个数,按变量个数补足nil
e,f,g=1,2
print(e,f,g)
--输出
--1 2 nil
--2.变量个数小于值的个数,多余的值被忽略
e,f=4,5,6
print(e,f,g)
--输出
--4 5 nil
--循环语句
--while
--[[
while 条件
do
循环体
end
]]--
while a<10
do
print("循环值a:",a)
--注意:lua里没有++或+=的操作
a=a+1
end
--输出
--[[
循环值a: 2
循环值a: 3
循环值a: 4
循环值a: 5
循环值a: 6
循环值a: 7
循环值a: 8
循环值a: 9
]]--
--repeat..until
--相当于c中的do while
--[[
repeat
循环体
until(条件)
]]--
a=1
repeat
print("循环值a:",a)
a=a+1
until a>10
--输出
--[[
循环值a: 1
循环值a: 2
循环值a: 3
循环值a: 4
循环值a: 5
循环值a: 6
循环值a: 7
循环值a: 8
循环值a: 9
循环值a: 10
]]--
--for循环 数值型for
--第三个参数可以缺省,缺省默认变化为1
--[[
for i=起始值,结束值,变化的值
do
循环体
end
]]--
for i=1,10,3
do
print("循环值i:",i)
end
--输出
--[[
循环值i: 1
循环值i: 4
循环值i: 7
循环值i: 10
]]--
--if else elseif
--1
if(a>5)then
print("one")
end
--2
if a>5 then
print("one")
end
--3
if(a>5)then
print("one")
else
print("two")
end
--4
if a>5 then
print("one")
elseif a<5 then
print("two")
elseif a==5 then
print("three")
end
--输出
--one
--one
--one
--one
--表 {} lua唯一的数据结构
--lua表的底层是由哈希表+数组实现的
--lua里的表可以直接看作哈希表
--lua里的数组下标从1开始的
--lua会根据开发者存储的数据去选择合适的数据结构,比如表用作数组时,底层通常会用
--数组形式去实现,如果是键值对,那底层也用键值对形式存储
tab={["key"]="value",["key1"]=value2,[1]="value3",["2"]="value4",[3]=3}
print(type(tab))
--["key"]="value" 键值对形式
--两种访问方式
print("索引为key的值:",tab["key"])
print("索引为key的值:",tab.key)
print("索引为key1的值:",tab["key1"])
print("索引为key1的值:",tab.key1)
print("索引为key2的值:",tab[key2])
print("索引为key2的值:",tab.key2)
--当key为数字类型时就不能采用点号访问
print("索引为1的值:",tab[1])
--print("索引为1的值:",tab.1)
--当key为数字字符串类型时就不能采用点号访问
print("索引为2的值:",tab["2"])
--print("索引为2的值:",tab."2")
print("索引为3的值:",tab[3])
print(#tab)
--输出
--[[
table
索引为key的值: value
索引为key的值: value
索引为key1的值: nil
索引为key1的值: nil
索引为key2的值: nil
索引为key2的值: nil
索引为1的值: value3
索引为2的值: value4
索引为3的值: 3
1
]]--
--[key2]="value3" 该赋值不被允许
--原因:索引值不能为nil
--为什么key2是nil
--[[
因为key2不属于八大类型之一,而变量赋值由
赋值的值类型决定,因此给值nil
]]--
--泛型for
--ipairs/pairs:迭代器
--ipairs:遍历时固定的从key为1开始,每次遍历key会累加1,
--如果key所对应的值不存在,则停止遍历
--形式
--for k,v in ipairs(表名) do
-- print(k,v)
--end
for k,v in ipairs(tab) do
print(k,v)
end
--输出
--1 value3
--pairs:会遍历表中的所有的键值对,即便pairs遇到了key所对应的值不存在,
--还是会继续遍历,而ipairs遇到nil就停止遍历
--形式
--for k,v in pairs(表名) do
-- print(k,v)
--end
for k,v in pairs(tab) do
print(k,v)
end
--输出
--key value
--2 value4
--1 value3
--3 3
--[[
如果表中为哈希表和数组混合时,lua会自动补替索引,key是从1开始补的
如果该key已经被占用了,就会覆盖掉
]]--
tab1={[1]="a","c",[3]="b"}
print("tab1lenth:",#tab1)
for k,v in pairs(tab1) do
print("tab1:",k,v)
end
--输出
--tab1lenth: 1
--tab1: 1 c
--tab1: 3 b
tab2={[2]="a",[1]="c",[3]="b"}
--输出
print("tab2lenth:",#tab2)
--tab2lenth: 3
tab3={[2]="a",[4]="c",[3]="b"}
--输出
print("tab3lenth:",#tab3)
--tab3lenth: 0
--#底层应该也是用ipairs来计算的
--它会从1开始计数,一直计算连续的数组,中断后输出中断前的个数
--因此print(#tab)
--结果为1
--如果key不是连续的
--自己定义函数去实现
tab={[1]="a",[3]="b"}
--求长度
function CalcluTableLength()
local count=0
for k,v in pairs(tab) do
count=count+1
end
return count
end
print("长度",CalcluTableLength())
--输出
--长度 2
print(#tab)
for i,v in ipairs(tab) do
print(i,v)
end
--1 a
for k,v in pairs(tab) do
print(k,v)
end
--1 a
--3 b
tab2={"a","b","c"}
for k,v in pairs(tab2) do
print(k,v)
end
print(#tab2)
--1 a
--2 b
--3 c
--3
--死循环
--while true
--do
-- print("1")
--end
--循环嵌套
--冒泡排序
tab={3,4,6,1,2,8,3}
for i=1,#tab do
for j=i+1,#tab do
if tab[i]>tab[j] then
tab[i],tab[j]=tab[j],tab[i]
end
end
end
for i=1,#tab do
print(tab[i])
end
--[[
1
2
3
3
4
6
8
]]--
--用表模拟实现list中的add方法
if tab[#tab+1]==nil then
tab[#tab+1]=100
end
for i=1,#tab do
print(tab[i])
end
--[[
1
2
3
3
4
6
8
100
]]--
--循环控制语句
a=1
while a<10
do
print("a的值为:",a)
a=a+1
if(a>5)then
break
end
end
--[[
a的值为: 1
a的值为: 2
a的值为: 3
a的值为: 4
a的值为: 5
]]--
--模拟实现continue效果
for i=1,10 do
repeat
if i==5 then
print("跳过")
break
end
print("i=",i)
until true
end
--[[
i= 1
i= 2
i= 3
i= 4
跳过
i= 6
i= 7
i= 8
i= 9
i= 10
]]--