最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Lua中的函數(shù)(function)、可變參數(shù)、局部函數(shù)、尾遞歸優(yōu)化等實(shí)例講解

 更新時(shí)間:2014年09月23日 09:37:34   作者:iCode0410  
這篇文章主要介紹了Lua中的函數(shù)(function)、可變參數(shù)、局部函數(shù)、尾遞歸優(yōu)化等實(shí)例講解,需要的朋友可以參考下

一、函數(shù)

在Lua中,函數(shù)是作為"第一類值"(First-Class Value),這表示函數(shù)可以存儲(chǔ)在變量中,可以通過參數(shù)傳遞給其他函數(shù),或者作為函數(shù)的返回值(類比C/C++中的函數(shù)指針),這種特性使Lua具有極大的靈活性。
 
Lua對(duì)函數(shù)式編程提供了良好的支持,可以支持嵌套函數(shù)。
 
另外,Lua既可以調(diào)用Lua編寫的函數(shù),還可以調(diào)用C語言編寫的函數(shù)(Lua所有的標(biāo)準(zhǔn)庫都是C語言寫的)。
 
定義一個(gè)函數(shù)

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

function hello()
print('hello')
end

hello函數(shù)不接收參數(shù),調(diào)用:hello(),雖然hello不接收參數(shù),但是還可以可以傳入?yún)?shù):hello(32)
 
另外如果只傳遞一個(gè)參數(shù)可以簡(jiǎn)化成functionname arg的調(diào)用形式(注意數(shù)值不行)

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

> hello '3'
hello
> hello {}
hello
> hello 3
stdin:1: syntax error near '3'

 
另外對(duì)變量名也不適用
復(fù)制代碼 代碼如下:

> a = 21
> print a
stdin:1: syntax error near 'a'

 
另外,Lua函數(shù)不支持參數(shù)默認(rèn)值,可以使用or非常方便的解決(類似Javascript)
復(fù)制代碼 代碼如下:

> function f(n)
>> n = n or 0
>> print(n)
>> end
> f()
0
> f(1)
1

Lua支持返回多個(gè)值,形式上非常類似Python:

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

> function f()
>> return 1,2,3
>> end
> a,b,c = f()
> print(a .. b .. c)
123

 
函數(shù)調(diào)用的返回值可以用于table:
復(fù)制代碼 代碼如下:

> t = {f()}
> print(t[1], t[2], t[3])
1        2        3
 
可見,f()返回的三個(gè)值分別稱為table的3個(gè)元素,但是情況并不總是如此:
復(fù)制代碼 代碼如下:

> t = {f(), 4}
> print(t[1], t[2], t[3])
1        4        nil

這次,f()返回的1,2,3只有1稱為table的元素;
復(fù)制代碼 代碼如下:

> t = {f(), f()}
> print(t[1], t[2], t[3], t[4], t[5])
1        1        2        3        nil

 
總之:只有最后一項(xiàng)會(huì)完整的使用所有返回值(假如是函數(shù)調(diào)用)。
 
對(duì)于無返回值的函數(shù),可以使用(f())的形式強(qiáng)行返回一個(gè)值(nil)
復(fù)制代碼 代碼如下:

> function g()
>> end
> print(g())
 
> print((g()))
nil

實(shí)際上,(f())形式的調(diào)用返回一個(gè)且只返回一個(gè)值
復(fù)制代碼 代碼如下:

> print((f()))
1
> print(f())
1        2        3

二、變長參數(shù)

Lua支持編程參數(shù),使用簡(jiǎn)單(借助于table、多重賦值)

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

> function f(...)
for k,v in ipairs({...}) do
print(k,v)
end
end
> f(2,3,3)
1        2
2        3
3        3

使用多重賦值的方式
復(fù)制代碼 代碼如下:

> function sum3(...)
>> a,b,c = ...
>> a = a or 0
>> b = b or 0
>> c = c or 0
>> return a + b +c
>> end
> =sum3(1,2,3,4)
6
> return sum3(1,2)
3

通常在遍歷變長參數(shù)的時(shí)候只需要使用{…},然而變長參數(shù)可能會(huì)包含一些nil;那么就可以用select函數(shù)來訪問變長參數(shù)了:select('#', …)或者 select(n, …)

select('#', …)返回可變參數(shù)的長度,select(n,…)用于訪問n到select('#',…)的參數(shù)

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

> =select('#', 1,2,3)
3
> return select('#', 1,2, nil,3)
4
> =select(3, 1,2, nil,3)
nil        3
> =select(2, 1,2, nil,3)
2        nil        3

注意:Lua5.0中沒有提供…表達(dá)式,而是通過一個(gè)隱含的局部table變量arg來接收所有的變長參數(shù),arg.n表示參數(shù)的個(gè)數(shù);

三、函數(shù)式編程

函數(shù)做一個(gè)First-Class Value可以賦值給變量,用后者進(jìn)行調(diào)用

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

> a = function() print 'hello' end
> a()
hello
> b = a
> b()
hello

匿名函數(shù)
復(fù)制代碼 代碼如下:

> g = function() return function() print 'hello' end end
> g()()
hello

函數(shù)g返回一個(gè)匿名函數(shù);
 
閉包是函數(shù)式編程的一種重要特性,Lua也支持
復(fù)制代碼 代碼如下:

> g = function(a) return function() print('hello'.. a); a = a + 1 end end
> f = g(3)
> f()
hello3
> f()
hello4

四、局部函數(shù)

局部函數(shù)可以理解為在當(dāng)前作用域有效的函數(shù),可以用local變量來引用一個(gè)函數(shù):

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

> do
>> local lf = function() print 'hello' end
>> lf()
>> end
hello
> lf()
stdin:1: attempt to call global 'lf' (a nil value)
stack traceback:
stdin:1: in main chunk
[C]: in ?

需要注意的是,對(duì)于遞歸函數(shù)的處理

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

> do
local lf = function(n)
if n <= 0 then
return
end
print 'hello'
n = n -1
lf(n)
end
lf(3)
end
hello
stdin:8: attempt to call global 'lf' (a nil value)
stack traceback:
stdin:8: in function 'lf'
stdin:9: in main chunk
[C]: in ?

而應(yīng)該首先聲明local lf, 在進(jìn)行賦值
復(fù)制代碼 代碼如下:

do
local lf;
lf = function(n)
if n <= 0 then
return
end
print 'hello'
n = n -1
lf(n)
end
lf(3)
end
hello
hello
hello

Lua支持一種local function(…) … end的定義形式:
復(fù)制代碼 代碼如下:

> do
local function lf(n)
if n <= 0 then
return
end
print 'hello'
n = n -1
lf(n)
end
lf(3)
end
hello
hello
hello
> lf(3)
stdin:1: attempt to call global 'lf' (a nil value)
stack traceback:
stdin:1: in main chunk
[C]: in ?

五、尾調(diào)用

所謂尾調(diào)用,就是一個(gè)函數(shù)返回另一個(gè)函數(shù)的返回值:

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

function f()

return g()
end
 
因?yàn)檎{(diào)用g()后,f()中不再執(zhí)行任何代碼,所以不需要保留f()的調(diào)用桟信息;Lua做了這樣的優(yōu)化,稱為"尾調(diào)用消除",g()返回后,控制點(diǎn)直接返回到調(diào)用f()的地方。
 
這種優(yōu)化對(duì)尾遞歸非常有益,通常遞歸意味著調(diào)用桟的不斷增長,甚至可能造成堆棧溢出;而尾遞歸提供了優(yōu)化條件,編譯器可以優(yōu)化掉調(diào)用桟。
 
下面的遞歸函數(shù)沒有使用尾遞歸,而參數(shù)為大數(shù)時(shí),堆棧溢出:
復(fù)制代碼 代碼如下:

> function f(n)
>> if n <= 0 then
>> return 0
>> end
>> a = f(n-1)
>> return n * a
>> end
> f(10000000000)
stdin:5: stack overflow
stack traceback:
stdin:5: in function 'f'
stdin:5: in function 'f'
stdin:5: in function 'f'
stdin:5: in function 'f'
stdin:5: in function 'f'
stdin:5: in function 'f'
stdin:5: in function 'f'
stdin:5: in function 'f'
stdin:5: in function 'f'
stdin:5: in function 'f'
...
stdin:5: in function 'f'
stdin:5: in function 'f'
stdin:5: in function 'f'
stdin:5: in function 'f'
stdin:5: in function 'f'
stdin:5: in function 'f'
stdin:5: in function 'f'
stdin:5: in function 'f'
stdin:5: in function 'f'
stdin:1: in main chunk
[C]: in ?

優(yōu)化為尾遞歸
復(fù)制代碼 代碼如下:

function f(n, now)
if n <= 0 then
return now
end
 
return f(n-1, now*n)
end
f(10000000000, 1)

運(yùn)行n久也無堆棧溢出;

相關(guān)文章

  • C++遍歷Lua table的方法實(shí)例

    C++遍歷Lua table的方法實(shí)例

    這篇文章主要介紹了C++遍歷Lua table的方法實(shí)例,本文給出了Lua table數(shù)據(jù)格式、C++實(shí)現(xiàn)的遍歷代碼以及輸出效果,需要的朋友可以參考下
    2015-04-04
  • Lua中的源代碼預(yù)編譯淺析

    Lua中的源代碼預(yù)編譯淺析

    這篇文章主要介紹了Lua中的源代碼預(yù)編譯淺析,Lua確實(shí)允許在運(yùn)行源代碼之前,將源代碼預(yù)編譯成一種中間形式(類比Python的.pyc),需要的朋友可以參考下
    2014-09-09
  • Lua中讓回調(diào)函數(shù)支持回調(diào)對(duì)象方法的解決方法

    Lua中讓回調(diào)函數(shù)支持回調(diào)對(duì)象方法的解決方法

    這篇文章主要介紹了Lua中讓回調(diào)支持對(duì)象方法,一般情況下,Lua中只支持回調(diào)一個(gè)函數(shù),本文方法實(shí)現(xiàn)可以回調(diào)一個(gè)對(duì)象的方法,需要的朋友可以參考下
    2014-12-12
  • Lua變量類型簡(jiǎn)明總結(jié)

    Lua變量類型簡(jiǎn)明總結(jié)

    這篇文章主要介紹了Lua變量類型簡(jiǎn)明總結(jié),本文總結(jié)了Lua中的6種變量類型,并一一說明,需要的朋友可以參考下
    2014-10-10
  • Lua中關(guān)于元方法的一些知識(shí)點(diǎn)小結(jié)

    Lua中關(guān)于元方法的一些知識(shí)點(diǎn)小結(jié)

    這篇文章主要介紹了Lua中關(guān)于元方法的一些知識(shí)點(diǎn)小結(jié),本文講解了兩個(gè)具有不同元表的值進(jìn)行算術(shù)操作、關(guān)系類的元方法、保護(hù)元表,需要的朋友可以參考下
    2014-09-09
  • Lua所有內(nèi)置函數(shù)羅列

    Lua所有內(nèi)置函數(shù)羅列

    這篇文章主要介紹了Lua所有內(nèi)置函數(shù)羅列,本文匯集了Lua腳本語言的所有內(nèi)置函數(shù),需要的朋友可以參考下
    2015-04-04
  • Lua編程示例(七):協(xié)同程序基礎(chǔ)邏輯

    Lua編程示例(七):協(xié)同程序基礎(chǔ)邏輯

    這篇文章主要介紹了Lua編程示例(七):協(xié)同程序基礎(chǔ)邏輯,本文直接給出代碼實(shí)例,需要的朋友可以參考下
    2015-07-07
  • Lua教程(五):C/C++操作Lua數(shù)組和字符串示例

    Lua教程(五):C/C++操作Lua數(shù)組和字符串示例

    這篇文章主要介紹了Lua教程(五):C/C++操作Lua數(shù)組和字符串示例,本文同時(shí)還講解了如何在C/C++函數(shù)里面存儲(chǔ)Lua狀態(tài),需要的朋友可以參考下
    2014-09-09
  • Lua中string.lower()使用指南

    Lua中string.lower()使用指南

    這篇文章主要介紹了Lua中操作字符串的基本方法整理,是Lua入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2016-08-08
  • Lua和C++的通信流程分解

    Lua和C++的通信流程分解

    這篇文章主要介紹了Lua和C++的通信流程分解,本文用一張圖講解了Lua和C++之間的通信流程,并對(duì)每一步做了分解,需要的朋友可以參考下
    2014-09-09

最新評(píng)論

扎赉特旗| 万山特区| 太康县| 金昌市| 凌源市| 平利县| 遵义市| 新干县| 久治县| 翁源县| 奎屯市| 上栗县| 防城港市| 卓资县| 山丹县| 保定市| 上蔡县| 新田县| 虞城县| 鹤庆县| 高碑店市| 凌源市| 澜沧| 东乌珠穆沁旗| 翼城县| 南康市| 苍梧县| 永吉县| 广昌县| 神木县| 双流县| 五莲县| 淮南市| 大港区| 边坝县| 太仆寺旗| 繁昌县| 河源市| 鄂伦春自治旗| 清流县| 宣威市|