Lua筆記--function

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語句
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容