◆ 區域性函式:
由於全域性變數一般會汙染全域性名字空間,同時也有效能損耗(即查詢全域性環境表的開銷),
因此我們應當盡量使用「區域性函式」,其記法是類似的,只是開頭加上 local 修飾符:
local
function
function_name
(arc)
-- body
end
由於函式定義等價於變數賦值,我們也可以把函式名替換為某個 lua 表的某個字段,例如
function foo.bar(a, b, c)
-- body ...
end
此時我們是把乙個函式型別的值賦給了 foo 表的 bar 字段。換言之,上面的定義等價於
foo.bar = function
(a, b, c)
print(a, b, c)
end
對於此種形式的函式定義,不能再使用 local 修飾符了,因為不存在定義新的區域性變數了。
◆ 函式引數問題:
在呼叫函式的時候,若形參個數和實參個數不同時,lua 會自動調整實參個數。調整規則:若實參個數大於形參個數,從左向右,多餘的實參被忽略;若實參個數小於形參個數,從左向右,沒有被實參初始化的形參會被初始化為 nil。
local
function
fun1
(a, b)
--兩個形參,多餘的實參被忽略掉
print(a, b)
endlocal
function
fun2
(a, b, c, d)
--四個形參,沒有被實參初始化的形參,用nil初始化
print(a, b, c, d)
endlocal x = 1
local y = 2
local z = 3
fun1(x, y, z) -- z被函式fun1忽略掉了,引數變成 x, y
fun2(x, y, z) -- 後面自動加上乙個nil,引數變成 x, y, z, nil
-->output12
123nil
◆ 變長引數
上面函式的引數都是固定的,其實 lua 還支援變長引數。若形參為 … , 表示該函式可以接收不同長度的引數。訪問引數的時候也要使用 … 。
local function func( ... ) -- 形參為 ... ,表示函式採用變長引數
local temp = -- 訪問的時候也要使用 ...
local ans = table.concat(temp, " ") -- 使用 table.concat 庫函式對數
-- 組內容使用 " " 拼接成字串。
print(ans)
endfunc(1, 2) -- 傳遞了兩個引數
func(1, 2, 3, 4) -- 傳遞了四個引數
-->output12
1234
luajit 2 尚不能 jit 編譯這種變長引數的用法,只能解釋執行。所以對效能敏感的**,應當避免使用此種形式。
◆ 具名引數
lua 還支援通過名稱來指定實參,這時候要把所有的實參組織到乙個 table 中,並將這個
table 作為唯一的實參傳給函式。
local
function
change
(arg)
-- change 函式,改變長方形的長和寬,使其各增長一倍
arg.width = arg.width * 2
arg.height = arg.height * 2
return arg
endlocal rectangle =
print("before change:", "width =", rectangle.width,
"height =", rectangle.height)
rectangle = change(rectangle)
print("after change:", "width =", rectangle.width,
"height =", rectangle.height)
-->output
before change: width = 20 height = 15
after change: width = 40 height = 30
◆ 按引用傳遞
當函式引數是 table 型別時,傳遞進來的是 實際引數的引用,此時在函式內部對該 table 所做的修改,會直接對呼叫者所傳遞的實際引數生效,而無需自己返回結果和讓呼叫者進行賦值。 我們把上面改變長方形長和寬的例子修改一下。
function
change
(arg)
--change函式,改變長方形的長和寬,使其各增長一倍
arg.width = arg.width * 2
--表arg不是表rectangle的拷貝,他們是同乙個表
arg.height = arg.height * 2
end-- 沒有return語句了
local rectangle =
print("before change:", "width = ", rectangle.width,
" height = ", rectangle.height)
change(rectangle)
print("after change:", "width = ", rectangle.width,
" height =", rectangle.height)
--> output
before change: width = 20 height = 15
after change: width = 40 height = 30
在常用基本型別中,除了 table 是按址傳遞型別外,其它的都是按值傳遞引數。 用全域性變數來代替函式引數的不好程式設計習慣應該被抵制,良好的程式設計習慣應該是減少全域性變數的使用。
◆ 函式返回值:
當函式返回值的個數和接收返回值的變數的個數不一致時,lua 也會自動調整引數個數。
調整規則: 若返回值個數大於接收變數的個數,多餘的返回值會被忽略掉; 若返回值個數小於引數個數,從左向右,沒有被返回值初始化的變數會被初始化為 nil。
function
init
() --init 函式 返回兩個值 1 和 "lua"
return
1, "lua"
endx = init()
print(x)
x, y, z = init()
print(x, y, z)
--output
11 lua nil
當乙個函式有乙個以上返回值,且函式呼叫不是乙個列表表示式的最後乙個元素,那麼函式呼叫只會產生乙個返回值, 也就是第乙個返回值。
local
function
init
() -- init 函式 返回兩個值 1 和 "lua"
return
1, "lua"
endlocal x, y, z = init(), 2
-- init 函式的位置不在最後,此時只返回 1
print(x, y, z) -->output 1 2 nil
local a, b, c = 2, init() -- init 函式的位置在最後,此時返回 1 和 "lua"
print(a, b, c) -->output 2 1 lua
函式呼叫的實參列表也是乙個列表表示式。考慮下面的例子:
local
function
init
() return
1, "lua"
endprint(init(), 2) -->output 1 2
print(2, init()) -->output 2 1 lua
如果你確保只取函式返回值的第乙個值,可以使用括號運算子,例如
local
function
init
() return
1, "lua"
endprint((init()), 2) -->output 1 2
print(2, (init())) -->output 2 1
Lua資料之table函式
table.getn 獲取長度 取長度操作符寫作一元操作 字串的長度是它的位元組數 就是以乙個字元乙個位元組計算的字串長度 對於常規的陣列,裡面從 1 到 n 放著一些非空的值的時候,它的長度就精確的為 n,即最後乙個值的下標。如果陣列有乙個 空洞 就是說,nil 值被夾在非空值之間 那麼 t 可能...
lua一些特殊函式說明
setcllvalue l,l top,cl 這是個巨集展開是這樣 l top value gc obj2gco cl top valud gc 設定為 clsour的 gc l top tt ctb lua tlcl 設定top的值為 checkliveness l,io 做乙個檢測操作 這個函式...
lua一些特殊函式說明
setcllvalue l,l top,cl 這是個巨集展開是這樣 l top value gc obj2gco cl top valud gc 設定為 clsour的 gc l top tt ctb lua tlcl 設定top的值為 checkliveness l,io 做乙個檢測操作 這個函式...