【语法】
一、机制原理
一行代码拆解:local name = nick ~= "" and nick or "无名侠客"。这行惯用式能跑通,靠的是 Lua 的 and/or 返回操作数本身而不是布尔值:a and b 在 a 为假时返回 a,否则返回 b;a or b 在 a 为真时返回 a,否则返回 b。于是 and/or 组合成了三目式的替代。但它有个隐蔽的坑:Lua 假值只有 nil 和 false,当想保留的值恰好是 0 或空串时,or 兜底会把它误换成默认值——数字 0 想原样保留,就必须绕开惯用式改显式判断。
二、错误写法
-- 错误:n 为 0 时被 or 换成了 1
local count = n or 1
三、正确写法
local function normalize(n, dft)
if n == nil then return dft end
return n
end
local p = getplayerbyname("op01")
sendmsg(p, 1, normalize(0, 1) .. "/"
.. normalize(nil, 1))
四、引擎验证
normalize(0,1) 保住 0,normalize(nil,1) 兜到 1;纯字符串场景下 and/or 三目式照常可用。
五、FAQ
问:三目式还能用吗?
答:能,只要左值不可能是 false 或 0。
问:连续 or 的顺序?
答:从左往右取到为真的操作数为止。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏功能】 一、先抛一个坑 影爆类技能为什么非要给目标头顶挂一个倒计时圈,引信到点自动炸不行吗?自动炸的版本省了倒计时圈,…
【游戏功能】 一、一个记不住的记忆灯序 回声记忆类玩法的首版测试,玩家第二轮就全军覆没。不是难度问题——灯序只有三步;是播放…
【游戏功能】 一、一个永远无解的谜题 光点翻转类解谜的第一版被测试打回:"第三关无解。"排查逻辑:点一个光点,它与上下左右四…
【游戏功能】 一、一个永远差一步的跳台 蓄力跳台玩法首版,玩家的抱怨高度一致:"按半秒和按三秒跳得一样远,那蓄力条是装饰吗?…
【游戏功能】 一、先抛一个坑 套圈摊位的圈扔出去,为什么有的游戏圈是抛物线飘过去的,有的是直线飞过去的?直线圈的判定简单,但…
【游戏功能】 一、一个被指针出卖的开箱 横向开箱卷轴首版上线,最刻薄的评论是:"减速那两秒我知道自己要出什么了,就问你尴尬不…