淺析java 希爾排序(Shell)算法。本站提示廣大學習愛好者:(淺析java 希爾排序(Shell)算法)文章只能為提供參考,不一定能成為您想要的結果。以下是淺析java 希爾排序(Shell)算法正文
編譯
Lua 固然是說明性說話,但 Lua 源碼老是被編譯為中央情勢後再履行。
dofile 用於載入並履行一個 Lua 文件,比擬之下,loadfile 用於載入一個 Lua 文件,但其實不履行,確實的說 loadfile 編譯了一個 chunk,並前往此被編譯的 chunk(被作為一個函數):
c = loadfile('./test.lua')
c()
dofile 可以被完成為:
function dofile(filename)
local f = assert(loadfile(filename))
return f()
end
一個相似 loadfile 的函數 load,它應用字符串(而非文件)作為參數,前往被編譯的 chunk:
f = load('i = i + 1')
i = 0
f(); print(i) --> 1
f(); print(i) --> 2
別的,我們可使用敕令 luac 來直接編譯 Lua 文件:
luac -o prog.lc prog.lua
lua prog.lc
毛病
Lua 碰見任何弗成接收的前提時會發生毛病。例如:
local t = {}
-- 失足
t = t + 1
我們可以顯式的挪用 error 函數來發生一個毛病,error 接收一個毛病新聞作為參數:
print 'enter a number:'
n = io.read('*n')
if not n then error('invalid input') end
assert 函數也能夠發生毛病。assert 函數檢討第一個參數能否為 false,假如不為 false 就前往此參數,假如為 false 就發生一個毛病。assert 的第二個參數,毛病新聞,是可選的。典范:
n = io.read()
assert(tonumber(n), 'invalid input: ' .. n .. ' is not a number')
pcall 函數可以捕捉毛病:
local ok, msg = pcall(function()
assert(false)
end)
print(ok, msg)
pcall 函數應用掩護形式(protected mode)挪用第一個參數(此參數為一個函數),假如被挪用的函數履行不存在毛病,pcall 前往 true 並前往被挪用函數的一切前往值,假如被挪用的函數發生了毛病,pcall 前往 false 並附帶上毛病新聞。嚴厲來講,毛病新聞紛歧定須要是字符串:
local ok, err = pcall(function()
error({code = 502})
end)
print(err.code)
追蹤毛病
我們先看一個函數:
function foo(str)
if type(str) ~= 'string' then
error('string expected')
end
-- ...
end
foo(1)
foo 函數須要一個字符串參數,我們履行下面的代碼:
lua: test.lua:3: string expected
輸入指出了毛病湧現在 foo 函數中(由於 foo 函數挪用了 error),而現實上,毛病是 foo 的挪用者發生的,而非 foo 發生的。我們可以設置 level 來修改這個報錯:
function foo(str)
if type(str) ~= 'string' then
error('string expected', 2)
end
-- ...
end
error 函數的第二個參數為 level,用於指定報錯的地位,level 值為 1 表現 error 的挪用者,值為 2 表現 error 的挪用者的挪用者,以此類推。
pcall 只能前往毛病新聞,許多時刻我們須要完全的挪用棧,這時候可使用 xpcall 函數。xpcall 函數可以吸收一個新聞 handler 作為參數,在被挪用函數湧現毛病時,新聞 handler 會被挪用,經由過程其便可以獲得到以後挪用棧的信息。