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)

浙公网安备 33010602011771号