Lua筆記--Function
函數定義
function foo(v1, v2)
//do something
end
函數調用
省略括號
Lua函數調用其中有一個比較特別的地方:當函數只有一個參數時(或者說此次調用只傳遞一個一個參數給該函數),并且這個參數是literal string(字符串字面量)或者是一個table constructor,此時函數調用時可以不用圓括號()
,舉例如下
s = 'hello'
print s --error: s is not a literal string
print 'hello' --right
function showtable(a)
for i = 1, #a do
print(a[i])
end
end
showtable{'I', 'am', 'learning', 'lua.'}
例中第二行為錯誤用法,因為s是一個string變量而不是一個string literal ,可以認為用引號引起來的就是literal
第九行直接使用了table constructor,省略了圓括號,至于何為constructor,翻翻書吧
參數個數
定義函數時的參數個數和調用時候的參數個數可以不一樣,可以多,可以少,Lua會自動匹配
function add( a, b )
local a = a or 0
local b = b or 0
local ans = a + b
return ans
end
print(add(2,3,4,5,'kidding me')) --absolutely right!
注意當調用時的參數比定義時的參數少時,函數可以會出錯。比如把上面的第2&3行去掉,然后調用add(1)
程序出錯。這是因為如果參數只有一個,那么b的值就是nil
,而nil變量和number變量a是不可以相加的。
為了防止這種情況,我們可以給參數附上缺省值,像上面的例子一樣。
返回值
Lua里面的函數可以返回多個值,神奇吧哈哈。
function max( a )
local m = 0
local mindex = 0
for i = 1, #a do
if m < a[i] then
m = a[i]
mindex = i
end
end
return m, mindex
end
a = {1,2,0,-4}
m = max(a)
print(m)
t,mi = max(a)
print(mi)
print(max(a))
print(max(a), 'lua')
類似調用和定義函數時的參數數目差別,lua會根據接收返回值的變量數量來決定返回幾個值
Lua always adjusts the number of results from a function to the circumstances of the call. When we call a function as a statement, Lua discards all results from the function. When we use a call as an expression, Lua keeps only the first result. We get all results only when the call is the last (or the only) expression in a list of expressions. These lists appear in four constructions in Lua: multiple assignments, arguments to function calls, table constructors, and return statements.
只有我們把多返回值函數當成表達式來用時,并且函數是在表達式列表的最后,我們才可能得到全部的返回值。
在以下四種表達式列表中,可以得到所有的返回值,否則的話,只返回第一個返回值
- 多變量賦值
- 當成函數參數
- table constructor
- return語句