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的数据类型分为booleanstring umber able

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 工具,将其安装目录下的 lualibsmobdebugmobdebug.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)
原文地址:https://www.cnblogs.com/tianyajuanke/p/4960529.html