你能预防Lua的短路评估吗?

时间:2014-08-22 08:16:59

标签: lua user-input conditional-statements short-circuiting

我正在开发一个允许用户输入Lua的脚本(特别是布尔条件),我正在尝试提供一个功能,它将对输入的脚本执行快速错误检查。

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

但是,如果输入的变量不正确,则很难发现问题。

让我们说用户输入以下内容:

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

就语法而言,loadstring()非常满意 - 它会添加' return'作为该字符串的前缀。

我的下一步是在执行用户输入的内容时检查错误。问题是,当value.custom_value_1 ~= 1时,逻辑会因为我们处理and而短路 - 我们没有必要继续前进,我们左边已经有了错误 - 手边。

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

有什么想法吗?

我目前最好的想法是过滤用户输入,整理出输入的每个值(基本上,不是条件orand,......)手动完成。但我认为值得检查是否有更好的方法。

3 个答案:

答案 0 :(得分:1)

防止短路评估不是您想要/可以做的事情。这就是它的工作方式。

你可以做的是:

if(logic1 and logic2)
{
// code on success
}
else
// check what kind of error we have
{
   if(~logic1)
   {
      // throw error type 1
   }
   if(~logic2)
   {
      // throw error type 2
   }
}

答案 1 :(得分:1)

如果您不介意预先解析字符串,可以使用像https://github.com/stravant/LuaMinify/blob/master/ParseLua.lua这样的库将源解析为AST,将短路注释修改为函数调用,如

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

然后编译此AST以检查错误。

虽然只是为了捕捉琐碎的错误,但似乎很麻烦。

答案 2 :(得分:0)

我不确定是否有人的答案是准确的,但字面上的问题是“你能否防止短路事故的发生?”我无法找到办法做到这一点。

我最终切断了用户输入并单独测试了每个组件,收集了这些错误并将它们反馈给用户。好像现在好了。