Lua資料之函式(特殊)

2021-08-23 14:34:21 字數 4414 閱讀 1743

◆ 區域性函式:

由於全域性變數一般會汙染全域性名字空間,同時也有效能損耗(即查詢全域性環境表的開銷),

因此我們應當盡量使用「區域性函式」,其記法是類似的,只是開頭加上 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 做乙個檢測操作 這個函式...