Lua 具名實參(通過table實現可選引數函式)

2021-08-07 15:53:06 字數 2573 閱讀 3920

具名實參:指具有名稱的實參。

將所有實參組織到乙個table中,並將這個table作為唯一的實參傳給函式。

對於引數很多的函式,有時很難記住引數的名字和引數的順序以及哪些引數是可選的。通過table可以在呼叫這類函式時可以隨意指定引數的順序,並且可以只傳遞需要設定的引數。這就是具名實參的好處。

函式的引數機制中,最基礎的方式是在呼叫乙個函式時,實參通過它在引數中的位置與形參匹配起來。

function

createpanel

(x, y, width, height, background ,border)

print(x)

print(y)

print(width)

print(height)

print(background)

print(border)

endcreatepanel(1,2,200,160,"white",1) --引數列表很長的時候,我們很難記起每個引數的具體含義

-- result:

-->1

-->2

-->200

-->160

-->white

-->1

以這種方式呼叫函式,在函式引數列表較長的時候,很難記清各個引數代表什麼意思,如果我們給實參指定具體的名字,就可以通過名稱來輕鬆匹配形參。我們將所有實參組織到乙個table中作為函式唯一的引數,來實現具名實參。

function

createpanel

( opt )

print(opt.x)

print(opt.y)

print(opt.width)

print(opt.height)

print(opt.background)

print(opt.border)

endcreatepanel() -- 引數是匿名table

-- result:

-->1

-->2

-->200

-->160

-->white

-->1

datatable =

createpanel(datatable) --另一種寫法

-- result:

-->1

-->2

-->200

-->160

-->white

-->1

有的時候,我們為一些引數設定了預設值,只想為某些引數賦值,其他引數使用預設值。這種情況下我們借助具名實參和另外乙個函式來實現可選引數函式。

--[[createpanel函式可以根據要求檢查一些必填的函式,或者為某些值新增預設值。"_createpanel"才是真正用於建立視窗的函式]]

-- 用於檢查引數和設定預設引數值的函式

function

createpanel

( opt )

-- 檢查引數型別

iftype(opt.height) ~= "number"

then

error("no height")

endiftype(opt.width) ~= "number"

then

error("no width")

end-- width和height為必填的具名引數,其他引數可選

_createpanel(opt.x or

0, --預設值為0

opt.y or

0, --預設值為0

opt.width , --無預設值

opt.height, --無預設值

opt.background or

"white", --預設值為「white」

opt.border or

1) --預設值為1

end-- 真正實現功能的函式

function

_createpanel

( x, y , width , height, background, border)

print(x)

print(y)

print(width)

print(height)

print(background)

print(border)

end

使用可選引數函式

createpanel()

-- result: 為每個引數賦值

-->1

-->2

-->200

-->160

-->white

-->1

createpanel()

-- result: 只為width、height賦值

-->0

-->0

-->200

-->100

-->white

-->1

createpanel()

-- result: 出錯 函式引數width和height沒有預設值必須為其賦值,否則會出錯

參考:

通過指標修改外邊實參

函式內容如何改變外部的實參?對於上面的問題,只有c中的指標能夠完成,基本資料型別作為函式實參,只是將值純粹的傳遞給形參,形參的改變並不影響實參.1 include2 3void swap char v1,char v2 1112 13int main int argc,const char argv...

C 之命名實參 通過乙個案例告訴你什麼是命名實參

有了命名實參,您將不再需要記住或查詢形參在所呼叫方法的形參列表中的順序。可以按形參名稱指定每個實參的形參。語法如下 par name value par name指向其傳遞value的形參名稱,par name呼叫的方法必須指定乙個有效的形參。下面看具體案例 如果乙個形參能被第二個形參整除 返回tr...

通過微服務名實現動態路由

預設情況下gateway會根據註冊中心的服務列表,以註冊中心上微服務名為路徑建立動態路由進行 從而實現動態路由的功能。1 修改9527的yml 需要注意的是uri的協議為lb,表示啟用gateway的負載均衡功能。lb servicename是spring cloud gateway在微服務中自動為...