勇哥注:
这里用代码方式演示一下Lua的语法,方便大家快速了解。
Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。 设计目的 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。 Lua 特性 轻量级: 它用标准C语言编写并以源代码形式开放,编译后仅仅一百余K,可以很方便的嵌入别的程序里。 可扩展: Lua提供了非常易于使用的扩展接口和机制:由宿主语言(通常是C或C++)提供这些功能, Lua可以使用它们,就像是本来就内置的功能一样。 其它特性: 支持面向过程(procedure-oriented)编程和函数式编程(functional programming); 自动内存管理;只提供了一种通用类型的表(table),用它可以实现数组,哈希表,集合,对象; 语言内置模式匹配;闭包(closure);函数也可以看做一个值; 提供多线程(协同进程,并非操作系统所支持的线程)支持; 通过闭包和table可以很方便地支持面向对象编程所需要的一些关键机制, 比如数据抽象,虚函数,继承和重载等。
几点说明:
下面演示代码中,OutMsg是C#中定义好的一个函数,原型是: void OutMsg(string msg),而lua的对应功能是print函数
lua对大小写敏感
以关键字local定义的变量是局部变量,其它都是全局变量,即使在方法内部定义的也一样
单行注释是: -- ,多行注释是:--[[ 多行注释 --]]
(一)关键字
(二)运算符
lua的数值计算符号跟C#一样。
关系运算符就是不等于不一样。
(三)数据类型
(四)循环
//循环
for i=1,10,1 do
OutMsg(tostring(i))
end
//倒序
for i=10,1,-1 do
OutMsg(tostring(i))
end
//注意..是字符串连接, 注意下面的a会被自动转为字符串
while( a < 20 )
do
OutMsg("a 的值为:" .. a)
a = a+1
end
//注意,break支持,但是没有continue,但是可以用goto语句来代替
a = 1
repeat
OutMsg("a 的值为:" .. a)
a = a + 1
if( a > 3) then
break
end
until( a > 15 )
end
//goto语句
for i = 1, 10 do
if i == 5 then
-- 当 i 等于 5 时,跳过当前迭代
goto continue
end
-- 执行的代码
print(i)
::continue::
end
(五)数组
//下标是从1开始,table.remove可以删除数组第几个元素, #符号求数组长度, 如果指定索引没有值返回nil
local str=""
local myArray = {10, 20, 30, 40, 50}
table.remove(myArray, 3)
for i=1,#myArray,1 do
str=str .. myArray[i] .. ","
end
OutMsg(str)
end
//用迭代器循环数组元素, key是索引, value是值
local str=""
local myArray = {10, 20, 30, 40, 50}
for key,value in ipairs(myArray)
do
str=str .. value .. ","
end
OutMsg(str)
(六)table(表)
table(表)是Lua特有的功能强大的东西
table 是 Lua 的一种数据结构用来帮助我们创建不同的数据类型,如:数组、字典等。
Lua table 使用关联型数组,你可以用任意类型的值来作数组的索引,但这个值不能是 nil。
Lua table 是不固定大小的,你可以根据自己需要进行扩容。
Lua也是通过table来解决模块(module)、包(package)和对象(Object)的。
例如string.format表示使用"format"来索引table string。
(1) table的构造
-- 初始化表
mytable = {}
-- 指定值
mytable[1]= "Lua"
-- 移除引用
mytable = nil
-- lua 垃圾回收会释放内存
(2)基本使用
mytable = {}
OutMsg("mytable 的类型是 " .. type(mytable))
mytable[1]= "Lua"
mytable["wow"] = "修改前"
OutMsg("mytable 索引为 1 的元素是 " .. mytable[1])
OutMsg("mytable 索引为 wow 的元素是 " .. mytable["wow"])
-- alternatetable和mytable的是指同一个 table
alternatetable = mytable
OutMsg("alternatetable 索引为 1 的元素是 " .. alternatetable[1])
OutMsg("mytable 索引为 wow 的元素是 " .. alternatetable["wow"])
alternatetable["wow"] = "修改后"
OutMsg("mytable 索引为 wow 的元素是 " .. mytable["wow"])
-- 释放变量
alternatetable = nil
OutMsg("alternatetable 是 " .. tostring(alternatetable))
-- mytable 仍然可以访问
OutMsg("mytable 索引为 wow 的元素是 ".. mytable["wow"])
mytable = nil
OutMsg("mytable 是 " .. tostring(mytable))
输出结果为:
mytable 的类型是 table
mytable 索引为 1 的元素是 Lua
mytable 索引为 wow 的元素是 修改前
alternatetable 索引为 1 的元素是 Lua
mytable 索引为 wow 的元素是 修改前
mytable 索引为 wow 的元素是 修改后
alternatetable 是 nil
mytable 索引为 wow 的元素是 修改后
mytable 是 nil
(3)Table 操作
//table.concat
mytable = {}
for i=1,10,1 do
mytable[i]= "a" .. i
end
--连接全部
--str=table.concat(mytable,",")
--连接索引1到9的元素
str=table.concat(mytable,",",1,9)
OutMsg(str)
//其它内建函数
table.insert (table, [pos,] value):
在table的数组部分指定位置(pos)插入值为value的一个元素. pos参数可选, 默认为数组部分末尾.
table.remove (table [, pos])
返回table数组部分位于pos位置的元素. 其后的元素会被前移. pos参数可选, 默认为table长度, 即从最后一个元素删起。
table.sort (table [, comp])
对给定的table进行升序排序。
(七)函数
//带返回值的函数
--[[ 函数返回两个值的最大值 --]]
function max(num1, num2)
if (num1 > num2) then
result = num1;
else
result = num2;
end
return result;
end
-- 调用函数
OutMsg("两值比较最大值为 ",max(10,4))
OutMsg("两值比较最大值为 ",max(5,6))
//函数可以当做参数传递进
myprint(10)
-- myprint 函数作为参数传递
add(2,5,myprint)
myprint = function(param)
OutMsg("这是打印函数 - ##" .. param .. "##")
function add(num1,num2,functionPrint)
result = num1 + num2
-- 调用传递的函数参数
functionPrint(result)
end
//多个返回值,注意你得用两个变量去接收,它并不是返回一个数组或者table
function LuaFunction()
local res1,res2=maximum({8,10,23,12,5})
OutMsg("两个返回值:" .. res1 .. "," .. res2)
function maximum (a)
local mi = 1 -- 最大值索引
local m = a[mi] -- 最大值
for i,val in ipairs(a) do
if val > m then
mi = i
m = val
end
end
return m, mi
end
//没返回值的函数
你只需要在自定义函数最后不写return,此时系统会返回一个nil
对于这种没返回值的函数,你可以不用定义一个变量来等于它。
//可变参数函数
如果有此需要的话,参考下面的文章:
https://www.runoob.com/lua/lua-functions.html
---------------------
作者:hackpig
来源:www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!

