Lua goto特性以及各種方便用途

2021-10-02 02:58:23 字數 2061 閱讀 7946

goto是lua5.2以後加入的新特性,和其它語言中的goto用法相似;

goto說明符會將一段程式轉換到乙個label,乙個label定義之後在整個**塊都是課件的,除了巢狀函式之外

用法如下:我們可以使用::gotoname_::來宣告乙個跳轉的標誌符,之後可以使用goto直接轉到該行**繼續執行;

在lua中,一直會被抱怨沒有continue關鍵字,使用goto就可以自己實現continue關鍵字;

for i=1,10 do

if i%3 ~= 0 then goto workflow end

print(i)

::workflow::

end

上面提到的是最常用的一種用法,即使用goto來實現continue關鍵字的功能;下面會介紹使用goto實現的一些其它方便地用途;

在continue關鍵字的實現過程中,我們並沒有寫goto跳轉後的邏輯;但是,這裡我們可以使用goto來到控制結構或函式末尾來做統一的邏輯處理;

如下示例:它用來處理乙個字串,函式內部先做判斷如果是字串型別就繼續處理,然後返回;否則,就執行丟擲錯誤;

這是乙個比較簡單的例子,它並沒有體現出該用途的強大之處,如果有多個分支需要做統一的錯誤處理,才能更好的看到方便之處;

local function process(input_)

if type(input_)~="string" then

goto exception

endprint("processing...."..input_)

do return end

::exception::

print("luaexception input is not string "..input_)

endprocess(100)

process("hello world")

在分支結構中的break,我們一次只能跳出當前的分支,當有多個迴圈結構而我們又想一次跳出多層迴圈時,就可以使用goto來完成;

for x=1,10 do

for y=1,10 do

for z=1,10 do

if x^2+y^2==z^2 then

print("found a pythagorean triple",x,y,z)

goto done

end

endend

end::done::

在上乙個巢狀中,我們是跳出了所有的迴圈,從而只找到了一組勾股數;

當我們需要找到所有的勾股數,我們就需要調整goto label的位置,這裡選擇跳到第一層迴圈中;

並且改善了for迴圈的變數,y從x開始,z從y開始,減少輪詢次數;

for x=1,10 do

for y=x,10 do

for z=y,10 do

if x^2+y^2==z^2 then

print("found a pythagorean triple",x,y,z)

print("trying found next one...")

goto done

end

endend

::done::

end

這裡把redo放置到for迴圈的開始位置,來實現redo功能;

for i=1,10 do

local e=i

::redo::

local flag=true

for j=i,e do

if j==i^2 then

print(i.."^2==",j)

flag=false

endend

if flag then

e=e+1

goto redo

endend

總結:goto label所放置的位置決定了其各種各樣的特性;

參考:lua-users:gotostatement

Mysql各種儲存引擎的特性以及如何選擇儲存引擎

下面我們重點介紹幾種常用的儲存引擎並對比各個儲存引擎之間的區別和推薦使用方式。特點 myisam bdb memory innodb archive 儲存限制 沒有 沒有 有 64tb 沒有 事務安全 支援 支援 鎖機制 表鎖 頁鎖 表鎖 行鎖 行鎖 b樹索引 支援 支援 支援 支援 雜湊索引 支援...

Mysql各種儲存引擎的特性以及如何選擇儲存引擎

下面我們重點介紹幾種常用的儲存引擎並對比各個儲存引擎之間的區別和推薦使用方式。特點myisam bdbmemory innodb archive 儲存限制 沒有沒有 有64tb 沒有事務安全 支援支援 鎖機制表鎖 頁鎖表鎖 行鎖行鎖 b樹索引 支援支援 支援支援 雜湊索引 支援支援 全文索引 支援集...

Mysql各種儲存引擎的特性以及如何選擇儲存引擎

下面我們重點介紹幾種常用的儲存引擎並對比各個儲存引擎之間的區別和推薦使用方式。特點myisam bdbmemory innodb archive 儲存限制 沒有沒有 有64tb 沒有事務安全 支援支援 鎖機制表鎖 頁鎖表鎖 行鎖行鎖 b樹索引 支援支援 支援支援 雜湊索引 支援支援 全文索引 支援集...