Lua函式式程式設計和區域性函式詳解

2021-07-30 00:23:10 字數 2109 閱讀 2173

函式式程式設計中的函式這個術語不是指計算機中的函式(實際上是subroutine),而是指數學中的函式,即自變數的對映。也就是說乙個函式的值僅決定於函式引數的值,不依賴其他狀態。比如sqrt(x)函式計算x的平方根,只要x不變,不論什麼時候呼叫,呼叫幾次,值都是不變的。

在函式式語言中,函式作為一等公民,可以在任何地方定義,在函式內或函式外,可以作為函式的引數和返回值,可以對函式進行組合。

函式做乙個first-class value可以賦值給變數,用後者進行呼叫:

**如下:

a = function() print 'hello' end

a()hello

b = a

b()hello

匿名函式

**如下:

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

g()()

hello

函式g返回乙個匿名函式;

閉包是函式式程式設計的一種重要特性,lua也支援

**如下:

g = function(a) return function()print('hello'.. a); a = a + 1 end end

f = g(3)

f()hello3

f()hello4

區域性函式可以理解為在當前作用域有效的函式,可以用local變數來引用乙個函式:

**如下:

do

local lf = function() print 'hello' end

lf()

endhello

lf()

stdin:1: attempt to call global 'lf' (a nilvalue)

stack traceback:

stdin:1: in main chunk

[c]: in ?

需要注意的是,對於遞迴函式的處理

**如下:

do

local lf = function(n)

if n <= 0 then

return

endprint 'hello'

n = n -1

lf(n)

endlf(3)

endhello

stdin:8: attempt to call global 'lf' (a nilvalue)

stack traceback:

stdin:8: in function 'lf'

stdin:9: in main chunk

[c]: in ?

而應該首先宣告local lf, 在進行賦值

**如下:

do

local lf;

lf = function(n)

if n <= 0 then

return

endprint 'hello'

n = n -1

lf(n)

endlf(3)

endhello

hello

hello

lua支援一種local function(…) … end的定義形式:

**如下:

do

local function lf(n)

if n <= 0 then

return

endprint 'hello'

n = n -1

lf(n)

endlf(3)

endhello

hello

hello

lf(3)

stdin:1: attempt to call global 'lf' (a nilvalue)

stack traceback:

stdin:1: in main chunk

[c]: in ?

python函式和區域性變數

不帶引數的方法,攜帶返回值 defmethod return 不攜帶引數的方法 不帶引數的方法,攜帶返回值 defmethod1 print 不攜帶引數的方法 二者區別 函式呼叫 print method 只執行方法,不列印的話無法顯示資訊 method1 在方法中直接進行了列印,可以直接顯示,但是...

lua 防禦式程式設計輔助函式

防禦式程式設計是提高軟體質量技術的有益輔助手段。防禦式程式設計的主要思想是 子程式應該不因傳入錯誤資料而被破壞,哪怕是由其他子程式產生的錯誤資料。這種思想是將可能出現的錯誤造成的影響控制在有限的範圍內。以上是引用自百科的一段描述,在實際編碼過程中,我們除了判斷引數是否合法外,還會 assert 非法...

lua學習 lua及函式式程式語言

無論 python,ruby,還是 erlang,lua,這幾個比較新銳的語言,都支援函式式程式設計。函式式程式設計到底具有哪些特點?相對於傳統的命令式語言,其優勢在什麼地方?函式式程式設計,有如下幾個特點 1 函式是第一型別。函式像其它資料型別一樣,可以被賦值,可以當做引數,也可以當做函式的返回值...