你能在Lua中防止短路计算吗?

我正在编写一个脚本,允许用户输入 Lua(具体来说是布尔条件),并且我正在尝试提供一个功能来对输入的脚本进行快速的错误检查。

如果loadstring()失败,很容易抛出错误,所以语法问题很容易处理。

但是,如果变量被错误地输入,就很难检测到问题。

假设用户输入以下内容:

value.custom_value_1 == 1 and valse.custom_value_2 ~= 1

就语法而言,loadstring()非常满意——它将“return”作为该字符串的前缀添加。

我的下一步是在执行用户输入的内容时检查错误。问题是,当value.custom_value_1 ~= 1时,逻辑将短路,因为我们正在处理and,没有继续下去的必要,因为我们已经在左侧得到了false。

我想要的是找到一种方式,使Lua完全评估表达式,而不是短路。如果这样做,拼写错误valse将被捕捉到(无论value.custom_value_1的值如何),我可以向最终用户提供错误消息。

有什么想法吗?

我目前最好的想法是筛选用户输入,分离出输入的每个值(基本上是不是条件性的orand等),然后手动处理。但是我认为值得检查是否有更好的方法。

点赞
用户1103318
用户1103318

防止短路评估并不是你想要或者可以做到的事情。这就是它运作的方式。

相反,你可以做的是这样的:

if(logic1 and logic2)
{
// 成功时的代码
}
else
// 检查我们遇到了哪种类型的错误
{
   if(~logic1)
   {
      // 抛出错误类型1
   }
   if(~logic2)
   {
      // 抛出错误类型2
   }
}
2014-08-22 08:42:59
用户542190
用户542190

如果你不介意事先解析字符串,你可以使用像 https://github.com/stravant/LuaMinify/blob/master/ParseLua.lua 这样的库将源代码解析为 AST,将短路提示修改为函数调用的形式,如下所示:

function my_and(x, y)
    return x and y
end

然后编译这棵 AST 来检查错误。

不过,为了捕捉琐碎的错误,似乎要费很大的功夫。

2014-08-22 08:50:28
用户3595710
用户3595710

我不确定是否有人的答案准确,但字面上的问题是“你能防止短路评估吗”,并且我没有找到一种方法来实现。

我最终将用户输入切成小块并逐个测试,收集这些错误并反馈给用户。看起来现在还不错。

2014-08-23 02:20:26