Lua函式的多個返回值

2021-08-27 06:08:43 字數 1849 閱讀 8231

lua中的函式的乙個很特殊也很有用的性質,即可以有多個返回值。包括一些內建的函式就是這樣。比如string.find函式,在給定的字串中查詢乙個pattern,如果有匹配的部分,則返回對應的頭、尾的兩個索引值;如果不存在匹配,則返回nil。當然,使用者定義的函式也可以有多個返回值,通過return關鍵字返回多個結果即可。比如乙個返回陣列中最大值及其索引的函式:

function max(a)

local m = a[1];

local mindex = 1;

for i,v in ipairs(a) do

if v>m then

m = v;

mindex = i;

endend

return m,mindex;

end

通常情況下,lua會根據函式呼叫的不同情況自動調整返回值的有效個數。主要有以下幾種情況:

1. 如果函式呼叫作為乙個單獨的語句,比如max(),則忽略所有的返回值;

2. 如果呼叫處在一串的表示式中:

1)如果處於表示式串的首位或中間,則只有第乙個返回值被返回;

2)如果處於最後乙個表示式,則所有的返回值都有效;

拿下面三個函式作為例子:

function f0() end;

function f1() return "a" end

function f2() return "a","b" end

在多重賦值中,如果函式呼叫作為僅有的或最後乙個表示式,則返回盡可能多的值來匹配左邊的變數,如果多出,自動忽略;如果不夠,賦為nil。比如,

x = f1()      		--x="a","b"被忽略

x,y = f1() --x="a",y="b"

x,y,z = f2() --x="a",y="b",z=nil

x,y,z = 10,f2() -- x=10, y="a", z="b"

x,y,z = f2(),10 -- x="a", y=10, z=nil, f2只返回乙個值

同理, 作為另乙個函式的引數時,規則一樣:

print(f2()) 	--> a b

print(f2(), 1) --> a 1

還有用來構造陣列時:

t =  				-- t = 

t = -- t[1] = nil, t[2] = "a", t[3] = 4

最後,當函式返回值作為另乙個函式的返回值被返回時,則全部被返回。如果想強制只返回乙個值 ,則可以用括號 "()" 把表示式括起來即可。比如:

function foo (i)

if i == 0 then return foo0()

elseif i == 1 then return foo1()

elseif i == 2 then return foo2()

endend

print(foo(1)) --> a

print(foo(2)) --> a b

print(foo(0)) -- (無返回值)

print(foo(3)) -- (無返回值)

如果想強制只返回乙個值,則可以用括號 "()" 把表示式括起來即可:

print((foo0())) --> nil

print((foo1())) --> a

print((foo2())) --> a

(見《programming in lua, 2rd》)

python函式多個返回值

python函式可以返回多個值嗎?答案是肯定的。比如在遊戲中經常需要從乙個點移動到另乙個點,給出座標 位移和角度,就可以計算出新的新的座標 import math def move x,y,step,angle 0 nx x step math.cos angle ny y step math.si...

主函式的返回值返回給誰 主函式返回值

responsebody報406 原因是 要返回的物件沒有setget方法sdfsdf 自定義視 析器和缺省視 析器需同時使用才好用 如果以redireci或forward字首,那麼 走缺省視 析器 return redirect index.jsp return forward index 需寫全...

函式返回值

這裡接著探求被調函式的返回值是如何傳遞到主調函式中的,下面為c程式。add函式通過直接返回a b的,而add1函式先定義乙個區域性變數c,儲存a b的值,然後再返回c的值。其中a b可以當成乙個臨時變數,其結果是暫時存放在暫存器中的 eax 參照反匯程式設計序,可以看出函式的值並不是通過壓棧 基址定...