亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

Lua極簡入門指南(一):函數篇

2024-07-21 23:04:16
字體:
來源:轉載
供稿:網友

Lua 和其他很多語言一樣,函數調用時參數列表被包裹在括號中:

 

復制代碼 代碼如下:

print('Hello World')

 

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

 

復制代碼 代碼如下:

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

 

Lua 為面向對象的調用提供了特殊的語法:

 

復制代碼 代碼如下:

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

 

Lua 調用的函數可能被定義在 Lua 中,也可能被定義在 C 中(Lua 標準庫中的所有函數都使用 C 編寫)。

函數的定義

 

復制代碼 代碼如下:

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

 

函數調用時,實參(arguments)和形參(parameters)個數可以不匹配,多余的實參會被丟棄,多余的形參值為 nil,例如:

 

復制代碼 代碼如下:

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

 

函數多值返回

在 Lua 中函數可以返回多個值。例如:

 

復制代碼 代碼如下:

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})

 

在多賦值時,多余的值會被丟棄,不足時變量值為 nil:

 

復制代碼 代碼如下:

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

 

在函數調用時形參的值處理上,在函數返回值的獲取上,都遵循這個規則。例如:

 

復制代碼 代碼如下:

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'}

 

再看一個例子:

 

復制代碼 代碼如下:

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

 

這里,由于函數調用不是在列表的最后一個位置,這時候函數只提供一個值。一個更有意義的例子:

 

復制代碼 代碼如下:

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

 

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

 

復制代碼 代碼如下:

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

 

一個比較有用的利用函數多值返回的特性的函數是 table.unpack,它接受一個數組作為參數,返回數組中的所有元素:

 

復制代碼 代碼如下:

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

 

變長參數

我們在使用 print 函數的時候可以傳遞任意數目的參數。Lua 提供了 … 表示參數列表,讓我們實現類似 print 的函數:

復制代碼 代碼如下:

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

 

再一個例子:

 

復制代碼 代碼如下:

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

 

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

 

復制代碼 代碼如下:

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

 

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

 

復制代碼 代碼如下:

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

 

不過需要注意的是,{…} 相比 table.pack(…) 來說更加高效,我們可以在確保沒有 nil 參數的時候使用。

函數是第一類值(first-class values)

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

復制代碼 代碼如下:

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

 

類似于 {} 作為 table 的構造器,我們可以認為 function(x) end 為函數的構造器:

 

復制代碼 代碼如下:

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

table.sort 函數用于排序,它可以接受一個排序函數作為參數:

 

 

復制代碼 代碼如下:

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

 

輸出結果為:

 

復制代碼 代碼如下:

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

 

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

閉包(closures)

很多語言都支持閉包(Golang、JavaScript 等)。一個函數和其訪問的外部變量組成一個閉包。看一個例子:

復制代碼 代碼如下:

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

 

這里的 c1 就是一個閉包(外部變量為 i),每次調用 newCounter 都會創建一個閉包(并創建一個新的變量 i):

復制代碼 代碼如下:

c2 = newCounter()
print(c2())   --> 1
print(c1())   --> 3
print(c2())   --> 2
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产成人+综合亚洲+天堂| 国产精品精品久久久| 久久久人成影片一区二区三区| 91免费看片网站| 97免费在线视频| 日韩美女在线播放| 精品久久久久久久久久久久| 欧美老女人bb| 97香蕉超级碰碰久久免费软件| 色偷偷88888欧美精品久久久| 欧美诱惑福利视频| 欧美激情久久久久久| 欧美视频二区36p| 黑人与娇小精品av专区| 91久久久久久久久久久久久| 91香蕉嫩草神马影院在线观看| 狠狠躁夜夜躁人人躁婷婷91| 亚洲精品视频网上网址在线观看| 精品亚洲一区二区三区在线播放| 91欧美激情另类亚洲| 国外成人在线直播| 91免费人成网站在线观看18| 欧美午夜性色大片在线观看| 国产精品久久久久一区二区| 丝袜一区二区三区| 国产精品自在线| 国产男人精品视频| 性亚洲最疯狂xxxx高清| 欧美日韩国产色| 欧美激情精品久久久久久蜜臀| 欧美国产第一页| 国产精品亚洲一区二区三区| 精品国产一区二区三区久久狼黑人| 日韩欧美在线视频观看| 欧美在线性视频| 深夜精品寂寞黄网站在线观看| 欧美影院在线播放| 中文字幕自拍vr一区二区三区| 91久久嫩草影院一区二区| 日本午夜人人精品| 日韩成人av一区| 欧美精品videofree1080p| 久久久久久亚洲| 久久综合色影院| 日韩免费在线电影| 国产欧美久久久久久| 亚洲欧洲自拍偷拍| 日韩视频免费在线| 亚洲欧洲国产精品| 久久久亚洲精选| 成人妇女淫片aaaa视频| 欧美激情成人在线视频| 亚洲精品一区久久久久久| 亚洲成av人片在线观看香蕉| 亚洲第一区中文字幕| 亚洲成人激情视频| 一本色道久久综合狠狠躁篇怎么玩| 欧美精品在线播放| 91国在线精品国内播放| 亚洲一区中文字幕在线观看| 欧美中文字幕视频在线观看| 日韩性xxxx爱| 国产999精品久久久影片官网| 精品国产美女在线| 欧美另类69精品久久久久9999| 成人激情在线观看| 国产乱人伦真实精品视频| 中文字幕欧美日韩在线| 国产日韩欧美夫妻视频在线观看| 国产精品日韩在线| 亚洲天堂免费观看| 国产精品国产三级国产专播精品人| 日韩精品久久久久久福利| 一区二区三区在线播放欧美| 欧美激情精品久久久久久久变态| 国产亚洲人成a一在线v站| 国产精品久在线观看| 91在线观看免费高清| 最近2019中文字幕第三页视频| 5566成人精品视频免费| 91久久精品一区| 国产综合色香蕉精品| 久久九九亚洲综合| 国产精品精品一区二区三区午夜版| 亚洲a区在线视频| 欧美最顶级丰满的aⅴ艳星| 亚洲精品视频免费在线观看| 这里只有精品视频| 久久婷婷国产麻豆91天堂| 欧美电影在线观看完整版| 欧美高清一级大片| 国产精品一区二区三| 国产视频精品一区二区三区| 伊人伊成久久人综合网站| 一区二区中文字幕| 日韩av在线免费观看一区| 国产精品久久久久久av福利软件| 亚洲嫩模很污视频| 日韩精品免费在线观看| 91九色单男在线观看| 欧美专区在线播放| 91久久精品美女高潮| 久久久噜噜噜久噜久久| 欧美午夜女人视频在线| 欧美在线不卡区| 91精品啪在线观看麻豆免费| 亚洲精品v天堂中文字幕| 久久精品视频在线播放| 在线观看欧美www| 91精品国产成人www| 久久久久久久av| 91在线中文字幕| 国产精品美女免费| 另类图片亚洲另类| 岛国av一区二区三区| 最近的2019中文字幕免费一页| 中文字幕亚洲欧美日韩在线不卡| 久久精品国产成人精品| 91色琪琪电影亚洲精品久久| 精品亚洲va在线va天堂资源站| 在线日韩日本国产亚洲| 欧美性猛交xxxxx免费看| 国产一区二区三区在线播放免费观看| 成人免费直播live| 高跟丝袜一区二区三区| 海角国产乱辈乱精品视频| 久久久人成影片一区二区三区观看| 欧美精品videosex性欧美| 超碰精品一区二区三区乱码| 亚洲美女性生活视频| 欧美电影免费播放| 亚洲欧美日韩国产中文专区| 欧美电影院免费观看| 成人黄色大片在线免费观看| 91在线国产电影| 色偷偷av一区二区三区乱| 欧美最猛性xxxxx亚洲精品| 色偷偷av一区二区三区乱| 亚洲人成77777在线观看网| 亚洲国产精品一区二区三区| 成人黄色片在线| 国产视频精品xxxx| 成人午夜一级二级三级| 情事1991在线| 欧美日韩成人网| 亚洲国产成人久久综合| 国产精品视频成人| 精品久久久中文| 色伦专区97中文字幕| 日本亚洲欧洲色α| 国产999精品久久久| 日本一区二区在线播放| 欧美高清在线视频观看不卡| 亚洲国产黄色片| 国产精品丝袜一区二区三区| 中文字幕免费精品一区| 日韩专区在线观看| 奇米一区二区三区四区久久| 亚洲人成电影网| 欧美激情18p| 国产日韩欧美夫妻视频在线观看| 国产精品精品国产| 精品人伦一区二区三区蜜桃免费| 91国产美女视频|