之前的項目開發(fā)中有聽到同事提及過有一種寫法函數(shù)在調(diào)用時會報錯澜搅,今天在看書的過程中又看到了贱勃,記錄下來:
local funA = function(n)
if n == 0 then
return 1
else
return n+funA(n-1)
end
end
print(funA(5))
例如上面的代碼,我們想求1+2+3+ ... +n的和彬坏,定義了一個函數(shù)funA芭挽,在funA遞歸調(diào)用自己烤芦。
我們運行是會發(fā)現(xiàn)報錯胁编。
lua: FunctionTest.lua:5: attempt to call global 'funA' (a nil value)
funA是個nil值沮榜,也就是我們沒有定義屈芜。
這是因為Lua我們的局部函數(shù)funA還沒有定義完郊愧,因此我們想要調(diào)用那么就是個nil,如果這是有個全局的函數(shù)funA井佑,那么他會調(diào)用全局的那個funA属铁。而非我們想要調(diào)用的局部函數(shù)funA,如下:
function funA(n)
print("我是全局的funA")
return 1
end
local funA = function(n)
if n == 0 then
return 1
else
return n+funA(n-1)
end
end
print(funA(5))
輸出:
[[--
我是全局的funA
6
[Finished in 0.0s]
--]]
對于這個問題我們可以先定義一個局部變量躬翁,然后在定義行數(shù)本身焦蘑。如下:
function funB(n)
print("我是全局的funB")
return 1
end
local funB
funB = function(n)
if n == 0 then
return 0
else
return n+funB(n-1)
end
end
print(funB(5))
輸出:
[[--
15
[Finished in 0.0s]
--]]
現(xiàn)在函數(shù)funB中調(diào)用的就是局部函數(shù)funB了。即使在函數(shù)定義的時候盒发,這個局部變量的值還有完成定義例嘱,但之后函數(shù)執(zhí)行的時候,funB就已經(jīng)有了正確的值了宁舰。
其實通常我們在寫過的過程中我們是這樣寫的:
function funC(n)
print("我是全局的funC")
return 1
end
local function funC(n)
if n == 0 then
return 0
else
return n+funC(n-1)
end
end
print(funC(5))
輸出:
[[--
15
[Finished in 0.0s]
--]]
這樣寫在Lua內(nèi)部也會把其展開成:
local funC
funC = function() --todo end