能否将Lua运算符存储为字符串变量并直接用于表达式运算?
Lua中能否将运算符存储为字符串并直接使用?
你给出的示例代码在Lua里会直接报错,因为Lua的语法不允许把字符串变量当作运算符直接放在表达式里。不过可以通过两种方式实现类似需求:
方法一:用表映射运算符到函数(推荐)
把每个运算符对应的判断逻辑写成匿名函数,存在一个表中,通过字符串键来调用对应的函数:
local ops = { ["=="] = function(a, b) return a == b end, ["~="] = function(a, b) return a ~= b end, [">"] = function(a, b) return a > b end, ["<"] = function(a, b) return a < b end, [">="] = function(a, b) return a >= b end, ["<="] = function(a, b) return a <= b end } local a, b, op = 1, 2, ">" if ops[op](b, a) then print("print something") end
这种方式既安全又高效,没有运行时编译的额外开销,是最稳妥的实现方式。
方法二:使用运行时编译(谨慎使用)
可以通过load(Lua 5.2及以上版本)或loadstring(Lua 5.1)动态生成代码并执行,但这种方式有安全隐患——如果op来自不可信的外部输入,可能会注入恶意代码,而且性能也不如第一种方法:
local a, b, op = 1, 2, ">" -- 针对固定数值的情况 local expr = string.format("return %d %s %d", b, op, a) local func = load(expr) if func() then print("print something") end
如果变量是动态的(不是固定数字),可以用环境表来传递变量:
local a, b, op = 1, 2, ">" local env = {b = b, a = a} local func = load("return b " .. op .. " a", nil, "t", env) if func() then print("print something") end
内容的提问来源于stack exchange,提问作者user3713179
相关产品推荐
相关产品推荐

