Lua
Lua编写与运行环境:
同python一样,可以在Linux下直接通过 lua 命令进行交互shell中运行,也可以通过 lua test.lua 文件运行,也可以在lua脚本里首行加上 #!/usr/bin/lua ,设置为可执行文件即可直接运行。
Lua数字型number,实际上只有64位double型。
字符串的定义有三种,使用单引号、双引号、双中括号,其中双中括号表示非转义字符串。
只有nil和false是false,其它都是true,包括其它语言中常见的0。
Lua里的变量,如果不使用local修饰则表示是全局变量,即使是处于函数或语句块中也是一样。
Lua没有++/+=此类操作,不等于用 ~= 表示,io.read() 与 io.write() 表示从stdio与stdout读写,字符串拼接使用../
repeat..until 相当于do..while
同golang一样,函数也可以返回多个值
Lua的table里可以存放任何类型,比如函数
t = {"hello",100,true,function() print "function()" end} t[4]() print(#t) --输出t的长度
函数有两种定义方式:
function func1() print("func1") end func2 = function() print("func2") end
Lua的全局变量全部存储于 _G 的表中,如:
global_str = "dfdf" print(_G.global_str) print(_G["global_str"])
遍历table:
t = {"hello",100,true,function() print "function()" end} for k,v in pairs(t) do print(k,v) end
元表:
local t = {} function t.__add(a, b) local sum = 0 for _, v in pairs(a) do sum = sum + v end for _, v in pairs(b) do sum = sum + v end return sum end t.__metatable = "lock" local t1 = {1,2,3} local t2 = {4,5,6} setmetatable(t1,t) setmetatable(t2,t) --setmetatable(t2,t1) --setmetatable(t2,t) --assert(t == getmetatable(t1)) --assert(t == getmetatable(t2)) --setmetatable(t1,t2) --print(getmetatable(t1)) print(t1+t2)
引入其它lua文件,如叫 test.lua,使用 require("test") 即可引用,所谓引用,会完全运行一次 test.lua。只有第一次执行,后面再次引入则不执行,dofile 与 loadfile
函数一般是通过.来调用,但也可以用:来调用,这意味着函数可以有一个隐式的形参 self
。 因此,如下写法:
function t:f (params) body end
是这样一种写法的语法糖:
t.f = function (self, params) body end
可以用 do ... end 来作用于一个代码段,相当于C语言中的{}作用,控制某些局部变量的作用范围。
lua5.1中的table函数:
t = {1,2,3,4} t1 = {1,3,5} t2 = {2,4,6} tt = {20,40,30,10} --输出数组 local print_table = function(t) local s = '[' for _,v in pairs(t) do s = s .. v ..',' end if #s ~= 1 then s = string.sub(s,1,#s -1) end s = s..']' print(s) end --table.concat local str = table.concat(t,'-',2,4) print('str:'..str) --table.insert table.insert(t,100) print_table(t) --table.remove table.remove(t) print_table(t) --table.sort table.sort(tt) print_table(tt) --table.maxn local size = table.maxn(t) print(size) tbl = {[1] = "a", [2] = "b", [3] = "c", [26] = "z"} print(#tbl) -- 因为26和之前的数字不连续, 所以不算在数组部分内 print(table.maxn(tbl)) --table.foreachi --对table中每一个键值对调用一个处理函数 t1 = {2, 4, 6, language="Lua", version="5", 8, 10, 12, web="hello lua"}; table.foreachi(t1, function(i, v) print (i, v) end) ; --等价于foreachi(t1, print)
180.167.2.131
nil 表示空类型
Lua的数据类型分为boolean\string\number\table
table是字典,但索引是从1开始。
通过 type() 可以获取变量的类型
默认变量都是全局变量,申明局部变量要用local
运算符很少,没有自增自减,只有+-*/%
关系运算符只有 <= < > >= ==
逻辑运算符 and or not
i = 0
while i < 5 do
print(i)
i = i + 1
end
i = 0
repeat
print(i)
i = i + 1
until i > 5
--Lua里只有break,没有continue,需要注意
for index = 1,100,2 do
print(index)
if index >= 50 then
break
end
end
function add(num1,num2)
return num1 + num2
end
print(add(1,2))
在 Unity 里使用 Lua 时,调试是一个比较麻烦的问题,可以使用 ZeroBrance Studio 工具,将其安装目录下的 lualibs\mobdebug\mobdebug.lua 文件复制到 lua 项目根目录下,然后在需要调试的 lua 脚本第一行加上: require('mobdebug').start()。
再开启 ZeroBrance Studio 的DEBUG服务器,再运行 Unity 工程就好了,如果调用了该调试的 lua 脚本,则会断在此处。
调试完之后,千万要先在 ZeroBrance Studio 运行完,才能终止 Unity项目,千万不可直接停止 ZeroBrance Studio 的 Debug 服务器,否则 Unity会意外退出。
元表与元方法:
不可以改变除表类型之外的值的元表,除非通过C API。
local t = {} function add(a, b) local sum = 0 for _, v in pairs(a) do sum = sum + v end for _, v in pairs(b) do sum = sum + v end return sum end t.__add = add local t1 = {1,2,3} local t2 = {4,5,6} setmetatable(t1,t) setmetatable(t2,t) assert(t == getmetatable(t1)) assert(t == getmetatable(t2)) print(t1+t2)