<h2 id="syntax">語法</h2>
局部變量和代碼塊
do
local a = 1
end
print(a) -- nil
控制語句
- Lua 認(rèn)為 false 和 nil 為假
if
if a == 0 then
b = 1
elseif not b then
b = 2
else
b = 3
end
while
i = 0
while i < 10 do
i = i + 1
end
repeat-until
i = 10
repeat
i = i + 1
until i > 20
先判斷條件捺癞,不滿足條件才執(zhí)行 repeat, 不同于 do-while
for
-- 1. 數(shù)值 for 循環(huán)
for i = 1, 10, 1 do
print(i)
end
print(i)
-- number: 1 - 10
-- nil
-- 2. 范型 for 循環(huán)
array = ['Lua', 'CSharp']
for key, value in ipairs(array) do
print(key .. ':' .. value)
end
-- string '1: Lua'
-- string '2: CSharp'
- 語法中聲明的變量為局部變量
- 語法中的表達(dá)式只計(jì)算一次
- 使用break跳出循環(huán)
- 數(shù)值 for 循環(huán)中夷蚊,表達(dá)式3(步長step)不傳默認(rèn)為1
- 范型 for 循環(huán)中,
ipair
為Lua 默認(rèn)提供的迭代函數(shù) ipairs
<h2 id="function">函數(shù)</h2>
聲明
function baz (a, b)
-- function body
end
foo = {
baz = baz
}
foo.baz = function (a, b)
-- 匿名函數(shù)
-- function body
end
function foo.baz (a, b)
-- function body
end
foo.baz = baz
調(diào)用
foo.baz(1) -- a: 1, b: nil
baz(1, 2) -- a: 1, b: 2
o:baz(1, 2) -- o.baz(o, 1, 2) 對象方法的調(diào)用
- 多余的參數(shù)會被忽略髓介,缺少的參數(shù)值為 nil
- 撬码,當(dāng)函數(shù)只有一個參數(shù)并且這個參數(shù)是字符串或者表構(gòu)造的時(shí)
候,()是可選的
print 'Hello World' -- print("Hello World")
dofile 'a.lua' -- dofile('a.lua')
print [[a multi-line
message]] -- print([[a multi-line
-- message]])
f{x=10, y=20} -- f({x=10, y=20})
type{} -- type({})
返回多個值
s, e = string.find('hello Lua Language', 'lua')
print(s, e) -- 7, 9
function baz ()
return 1, 2
end
print(baz()) -- 1, 2
x = baz() -- x: 1
x, y = baz() -- x: 1, y: 2
x, y, z = 10, baz() -- x: 10, y: 1, z: 2
a = { 'lua', baz() } -- a: {'lua', 1, 2}
可變參數(shù)
function g (a, b, ...) end
--[[
CALL PARAMETERS
g(3) a=3, b=nil, arg={n=0}
g(3, 4) a=3, b=4, arg={n=0}
g(3, 4, 5, 8) a=3, b=4, arg={5, 8; n=2}
]]--
尾調(diào)用
尾調(diào)用是一種類似在函數(shù)結(jié)尾的 goto 調(diào)用版保,當(dāng)函數(shù)最后一個動作是調(diào)用另外一個函
數(shù)時(shí),我們稱這種調(diào)用尾調(diào)用夫否。
function f(x)
return g(x)
end
-- g 的調(diào)用是尾調(diào)用彻犁。
一些編譯器比如 Lua 解釋器利用這種特性在處理尾調(diào)用時(shí)不使用額外的棧,我們稱這種語
言支持正確的尾調(diào)用凰慈。
由于尾調(diào)用不需要使用椆保空間,那么尾調(diào)用遞歸的層次可以無限制的微谓。例如下面調(diào)
用不論 n 為何值不會導(dǎo)致棧溢出森篷。
function foo (n)
if n > 0 then
return foo(n - 1)
end
end
<h2 id="common_func">常用函數(shù)</h2>
- 排序 table
table.sort(table, sortFunc)
table.sort(pet, function (a, b)
return a.name > b.name
end)
- 處理異常
if pcall(foo) then
-- no errors while running `foo'
-- ...
else
-- `foo' raised an error: take appropriate actions
-- ...
end
-- or
local status, err = pcall(function () error({code=121}) end)
print(err.code) --> 121