函式式程式設計中的函式這個術語不是指計算機中的函式(實際上是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 函式是第一型別。函式像其它資料型別一樣,可以被賦值,可以當做引數,也可以當做函式的返回值...