国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁(yè) > 開(kāi)發(fā) > 綜合 > 正文

Lua極簡(jiǎn)入門(mén)指南(一):函數(shù)篇

2024-07-21 23:04:16
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

Lua 和其他很多語(yǔ)言一樣,函數(shù)調(diào)用時(shí)參數(shù)列表被包裹在括號(hào)中:

 

復(fù)制代碼 代碼如下:

print('Hello World')

 

特別的情況是,如果函數(shù)調(diào)用時(shí)只有一個(gè)參數(shù),并且此參數(shù)為字符串 literal(字面量)或者 table 構(gòu)造器(constructor)時(shí),包裹參數(shù)的括號(hào)可以省略:

 

復(fù)制代碼 代碼如下:

print 'Hello World' <--> print('Hello World')
type{}              <--> type({})

 

Lua 為面向?qū)ο蟮恼{(diào)用提供了特殊的語(yǔ)法:

 

復(fù)制代碼 代碼如下:

o:foo(x) <--> o.foo(o, x)

 

Lua 調(diào)用的函數(shù)可能被定義在 Lua 中,也可能被定義在 C 中(Lua 標(biāo)準(zhǔn)庫(kù)中的所有函數(shù)都使用 C 編寫(xiě))。

函數(shù)的定義

 

復(fù)制代碼 代碼如下:

function add(a)
    local sum = 0
    for i = 1, #a do
        sum = sum + a[i]
    end
    return sum
end
 
print(add{1, 2, 3})

 

函數(shù)調(diào)用時(shí),實(shí)參(arguments)和形參(parameters)個(gè)數(shù)可以不匹配,多余的實(shí)參會(huì)被丟棄,多余的形參值為 nil,例如:

 

復(fù)制代碼 代碼如下:

function f(a, b) print(a, b) end
f(3)         --> 3 nil
f(3, 4)      --> 3 4
f(3, 4, 5)   --> 3 4

 

函數(shù)多值返回

在 Lua 中函數(shù)可以返回多個(gè)值。例如:

 

復(fù)制代碼 代碼如下:

function maximum(a)
    local mi = 1
    local m = a[mi]
    for i = 1, #a do
        if a[i] > m then
            mi = i; m = a[i]
        end
    end
    return m, mi
end
 
print(maximum{8, 10, 23, 12, 5})

 

在多賦值時(shí),多余的值會(huì)被丟棄,不足時(shí)變量值為 nil:

 

復(fù)制代碼 代碼如下:

x, y = 1        --> x == 1, y == nil
x, y = 1, 2, 3  --> x == 1, y == 2

 

在函數(shù)調(diào)用時(shí)形參的值處理上,在函數(shù)返回值的獲取上,都遵循這個(gè)規(guī)則。例如:

 

復(fù)制代碼 代碼如下:

function foo0() end
function foo1() return 'a' end
function foo2() return 'a', 'b' end
 
x, y = foo2()         --> x == 'a', y == 'b'
x = foo2()            --> x == 'a'
x, y, z = 10, foo2()  --> x == 10, y == 'a', z == 'b'
 
t = { foo2() }        --> {'a', 'b'}

 

再看一個(gè)例子:

 

復(fù)制代碼 代碼如下:

function foo2() return 'a', 'b' end
x, y = foo2(), 20    --> x == 'a', y == 20

 

這里,由于函數(shù)調(diào)用不是在列表的最后一個(gè)位置,這時(shí)候函數(shù)只提供一個(gè)值。一個(gè)更有意義的例子:

 

復(fù)制代碼 代碼如下:

function foo2() return 'a', 'b' end
 
print(foo2())     --> a b
print(foo2(), 1)  --> a 1

 

如果函數(shù)調(diào)用在列表的最后一個(gè)位置,同時(shí)使用 () 包裹函數(shù)調(diào)用,這時(shí)候函數(shù)也只提供一個(gè)值:

 

復(fù)制代碼 代碼如下:

function foo2() return 'a', 'b' end
 
print(foo2())     --> a b
print((foo2()))   --> a

 

一個(gè)比較有用的利用函數(shù)多值返回的特性的函數(shù)是 table.unpack,它接受一個(gè)數(shù)組作為參數(shù),返回?cái)?shù)組中的所有元素:

 

復(fù)制代碼 代碼如下:

print({10, 20, 30})               --> table: 00000000005BBE00
print(table.unpack{10, 20, 30})   --> 10 20 30

 

變長(zhǎng)參數(shù)

我們?cè)谑褂?print 函數(shù)的時(shí)候可以傳遞任意數(shù)目的參數(shù)。Lua 提供了 … 表示參數(shù)列表,讓我們實(shí)現(xiàn)類(lèi)似 print 的函數(shù):

復(fù)制代碼 代碼如下:

function add(...)
    local s = 0
    for _, v in ipairs{...} do
        s = s + v
    end
    return s
end
 
print(add(3, 4, 5))  --> 12

 

再一個(gè)例子:

 

復(fù)制代碼 代碼如下:

function test(...)
    local a, b = ...
    print(a, b)
end
 
test(1, 2, 3)  --> 1 2

 

還有一個(gè)特殊情況,我們需要注意:

 

復(fù)制代碼 代碼如下:

function p(...)
    for _, v in ipairs{...} do
        print(v)
    end
end
 
p(1, nil, 3)      --> 1
print(1, nil, 3)  --> 1 nil 3

 

上例可以看到,我們的 p 函數(shù)在參數(shù)中存在 nil 時(shí)并非按我們的意愿輸出了結(jié)果。Lua 提供了一個(gè) table.pack 函數(shù),用于獲取其調(diào)用參數(shù)(包括 nil 參數(shù))并返回一個(gè)包含所有參數(shù)的 table,此 table 存在一個(gè)額外的域 n,用于表示參數(shù)的數(shù)量:

 

復(fù)制代碼 代碼如下:

function p(...)
    local arg = table.pack(...)
    for i = 1, arg.n do
        print(arg[i])
    end
end
 
p(1, nil, 3, nil)  --> 1 nil 3 nil

 

不過(guò)需要注意的是,{…} 相比 table.pack(…) 來(lái)說(shuō)更加高效,我們可以在確保沒(méi)有 nil 參數(shù)的時(shí)候使用。

函數(shù)是第一類(lèi)值(first-class values)

我們能夠像使用其他變量一樣的使用函數(shù):

復(fù)制代碼 代碼如下:

a = { p = print }
a.p('Hello World')  --> Hello World
print = math.sin
a.p(print(1))       --> 0.8414709848079

 

類(lèi)似于 {} 作為 table 的構(gòu)造器,我們可以認(rèn)為 function(x) end 為函數(shù)的構(gòu)造器:

 

復(fù)制代碼 代碼如下:

local add = function(a, b)
    return a + b
end
 
print(add(1, 2))
 
-- 另一種寫(xiě)法
local function add(a, b)
    return a + b
end

table.sort 函數(shù)用于排序,它可以接受一個(gè)排序函數(shù)作為參數(shù):

 

 

復(fù)制代碼 代碼如下:

network = {
    { name = "grauna", IP = "210.26.30.34" },
    { name = "arraial", IP = "210.26.30.23" },
    { name = "lua", IP = "210.26.23.12" },
    { name = "derain", IP = "210.26.23.20" },
}
 
print('--------------')
for _, v in ipairs(network) do
    print(v.name)
end
 
table.sort(network, function(a, b)
    return a.name > b.name
end)
 
print('--------------')
for _, v in ipairs(network) do
    print(v.name)
end

 

輸出結(jié)果為:

 

復(fù)制代碼 代碼如下:

--------------
grauna
arraial
lua
derain
--------------
lua
grauna
derain
arraial

 

在此例中,我們提供的排序函數(shù)作為一個(gè)參數(shù)傳遞給 table.sort 函數(shù),像此排序函數(shù)這樣沒(méi)有名字的函數(shù)被叫做匿名函數(shù)。

閉包(closures)

很多語(yǔ)言都支持閉包(Golang、JavaScript 等)。一個(gè)函數(shù)和其訪(fǎng)問(wèn)的外部變量組成一個(gè)閉包??匆粋€(gè)例子:

復(fù)制代碼 代碼如下:

function newCounter()
    local i = 0
    return function()
        i = i + 1
        return i
    end
end
 
c1 = newCounter()
print(c1())   --> 1
print(c1())   --> 2

 

這里的 c1 就是一個(gè)閉包(外部變量為 i),每次調(diào)用 newCounter 都會(huì)創(chuàng)建一個(gè)閉包(并創(chuàng)建一個(gè)新的變量 i):

復(fù)制代碼 代碼如下:

c2 = newCounter()
print(c2())   --> 1
print(c1())   --> 3
print(c2())   --> 2
發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
在线国产一区二区三区| 国产成人亚洲欧美电影| 国产成人亚洲欧美电影| 国产精品人人爱一区二区白浆| 国产美女视频一区二区二三区| 亚洲第一区视频| 先锋影音av中文字幕| 久久er视频| 国产精品视频一区二区久久| 992tv在线观看在线播放| 日本黄色免费网址| 中文字幕视频免费在线观看| 精品国产高清a毛片无毒不卡| 四虎成年永久免费网站| 狠狠操五月天| 国产福利片在线| 黄网站在线观看高清免费| 国产人成在线观看| 青草青在线视频| 国产福利视频在线观看| eeuss影院在线观看第一页| 国产中文字幕在线观看| 在线免费看黄| 国产一卡2卡3卡四卡网站| 亚洲精品乱码电影在线观看| 最好看更新中文字幕| 亚洲精品天堂在线| 国产午夜三区视频在线| 福利在线观看| 美女网站在线观看| eeuss影影院www在线播放| 国产成人亚洲精品播放器下载| 日本成a人片在线观看| 国产福利微拍精品一区二区| 尤物免费看在线视频| 亚洲综合激情六月婷婷在线观看| 国产美女在线一区二区三区| 麻豆av在线| 日本福利午夜视频在线| 国产成人精品自线拍| 最近免费中文字幕大全免费第三页| av三级在线观看| 中文视频在线| 在线国产一区二区三区| 在线观看免费视频一区二区三区| 国产激情视频在线观看| 国产三级视频在线看| 国产精品bbw一区二区三区| 中文字幕在线视频观看| 2018av男人天堂| 中文字幕人成高视频| 国产乱xxⅹxx国语对白| 五月天婷婷基地| 国产三级在线播放| 国产二区视频在线观看| 在线免费看黄| 欧美日韩在线视频免费观看| 青青草观看免费视频在线| 开心婷婷激情五月| 狠狠操五月天| 国产精品理人伦一区二区三区| 国产激情小视频在线| av男人的天堂网| 欧美日韩亚洲国内综合网| 国产另类图片| 国产一级大片| 69久久精品| 轻轻色免费在线视频| 国产秒拍福利视频露脸| 国产精美视频| 亚洲精品在线播放视频| 国产女人伦码一区二区三区不卡| 国产精品剧情一区二区在线观看| 精品欧美不卡一区二区在线观看| av在线日韩国产精品| 天堂亚洲精品| 日本成人a视频| 国产精品人人爱一区二区白浆| 夜夜操com| 国产一二三区在线观看| 亚洲sss视频| 国产系列电影在线播放网址| 中文资源在线网| 国产乱妇乱子在线播视频播放网站| 9999在线视频| 国产视频一二区| 国产在线你懂得| av中文在线| 91亚洲天堂| 国产精品不卡一区二区三区在线观看| 青草av在线| 亚洲一区免费在线| 国产成人精品实拍在线| 最近中文字幕mv免费高清视频8| www狠狠操| 性网站在线播放| 精精国产xxxx视频在线动漫| 国产人成精品| 国产激情在线| 国产成人亚洲综合小说区| 最好看更新中文字幕| 国产麻豆精品高清在线播放| 亚洲天堂视频在线观看免费| 国产高清自拍视频在线观看| 国产精品第八页| 国产极品嫩模在线视频一区| 国产偷窥老熟盗摄视频| 国产精品伦一区二区三区级视频频 | av高清在线| 国产黄色小视频| 国产日产一区二区三区| 国产色视频网站| 91极品在线| 先锋av资源网| 久草在线视频网| 国产九九九九| ·天天天天操| 精品福利视频导航大全| 亚洲久草视频| 国产资源在线看| 国产激情视频在线观看| 天堂√中文在线| 国产麻豆高清视频在线第一页 | 欧洲亚洲精品视频| 欧美日韩在线精品成人综合网| 麻豆视频国产| 国产精品欧美色图| 四虎国产精品永久在线| 成人欧美精品久久久久影院| 国产一级性片| 亚洲精品影视在线| 中文字幕不卡| 日韩欧美中文字幕不卡| 综合图区亚洲白拍在线 | 国产精品美女视频免费观看软件| 在线中文字幕视频| 中文字幕网在线| 亚洲xxxxxx| 国产精品18久久久久网站| 人成在线免费视频| 国产精美视频| 国产农村av| www.夜夜操.com| 国产福利资源| 成在线人视频免费视频| 日本片在线看| 国产叼嘿网站免费观看不用充会员| 久久国产综合视频| 四虎精品成人a在线观看| 91资源在线观看| 国产一级黄色电影| 国产乱在线观看视频| 免费国产在线视频| 亚洲精品乱码电影在线观看| 国产精品久久久久久福利| 国产在线麻豆精品| 久草电影在线| 免费黄色网页在线观看| 四虎久久影院| 国产对白国语对白| 国产精品扒开做爽爽爽的视频| 国产精品自拍在线观看| 国产原创av在线| 麻豆视频在线观看免费网站| www555久久| 日p在线观看| 日本电影全部在线观看网站视频| 一本久久精品| 欧洲亚洲精品视频| 九九在线视频| 日本中文字幕视频| 国产91足控脚交在线观看| 91高清国产| 99精品老司机免费视频| 亚洲一道本在线| 青草视频在线播放| 国产尤物一区二区三区| 国产精品作爱| 国产精品欧美韩国日本久久| 99高清免费国产自产拍| 毛片在线视频| 国产一级片在线播放| 精品久久亚洲一级α| 欧美日韩在线视频免费观看| 国产精品一区二区资源| 国产爆初菊在线观看免费视频网站| 在线观看中文字幕| 中文字幕在线免费视频| 国产高清在线a视频大全| wwwww在线观看免费视频| 午夜视频在线免费| 亚洲an天堂an在线观看| 国产乱xxⅹxx国语对白| 亚洲电影视频在线| 国产精品入口麻豆电影| 欧美韩日国产| 中文av资源在线| 国产一区二区三区不卡免费观看 | 国产精品四虎| 开心快乐六月丁香婷婷|