【语法算法】
goto 的跳转语义就这一行:
::label_name::
-- ... 代码 ...
goto label_name
::label_name:: 定义标签,goto label_name 跳到标签——goto 的全部语法就这两行。可这两行的后面各有一个限制:后面是"不能跳入局部变量的作用域",前面是"标签必须在同一代码块或外层代码块中"。今天拆开。
一、定义、跳转、限制三段
goto 的三段。定义:::label:: 在代码中标记一个位置——标签本身不执行任何代码,它只是一个跳转目标。跳转:goto label 让执行流跳到标签处——跳转是无条件的,不判断任何条件——和 break 不同,goto 可以向前跳也可以向后跳。限制:goto 不能跳入局部变量的作用域——如果标签后面声明了局部变量,goto 不能从外面跳到那个局部变量的声明之后——Lua 的作用域规则限制了 goto 的跳跃范围。三段连起来:goto 玩的是"精确的执行流控制"——break 只能跳出当前循环,goto 可以跳到任何标签处——精细但危险。
graph TD
A["::retry::"] --> B["代码块"]
B --> C{"条件判断"}
C -->|失败| A["goto retry"]
C -->|成功| D["继续执行"]
D --> E["::done::"]
二、continue 的模拟写法
for i = 1, 10 do
if i % 2 == 0 then
goto continue
end
print("奇数:", i)
::continue::
end
Lua 没有 continue 关键字——goto continue 是模拟 continue 的标准写法——标签放在循环体末尾,条件不满足时跳到末尾跳过本次迭代——这是 goto 在 Lua 中最正当的用途。
三、continue 的模拟和向后跳的陷阱
continue 模拟是 goto 最常见的用途——Lua 没有内置 continue,goto 是社区的共识替代方案——标签放在循环体末尾,goto 跳过去就等于跳过了本次迭代的剩余代码。向后跳是 goto 最危险的用法:::retry:: ... goto retry 构成一个无限循环——必须有明确的退出条件——退出条件写在 goto 之前的条件判断里,不满足退出条件就 goto,满足就继续往下——向后跳的循环要有计数器或超时保护。最后一条纪律:goto 不能跳入函数——每个函数有自己独立的代码块和作用域——goto 只能在同一个函数内跳转——跨函数的跳转需要协程或回调,goto 做不到。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏功能】 香烧着的时候,人心最定。焚香把这句老话做成了机制:点一炷八秒的香,香烧着的三刀一叩首——每叩一回,血回六点。香…
【游戏功能】 下一封战书是什么概念?是你和它同时签下"六秒内往死里打"的字据:你加三,它加四——它的刀更疼,你的刀也不再客气…
【游戏功能】 日志里躺着一条没人在意的细节:某只头目的治疗明细里,回血来源写着一颗珠子的名字——两颗珠子轮流替它回血,每两秒…
【游戏功能】 oil = oil - 1 —— 灯芯上两秒烧掉的一滴油,就是挑灯的全部家底:灯亮着,刀足十;油见底,刀软成五…
【游戏功能】 守塔组出过一单静悄悄的失误:同一批怪,同样的守塔人,有的晚上一血没掉,有的被摸了三回——查录像才发现,守得住的…
【游戏功能】 为什么有些玩家越打越软?前二十刀刀刀十点,二十刀之后刀刀四点——装备没变,变的是气。匀气把这件事做成了明账:五…