你能防止 Lua 中的短路评估吗?

Posted

技术标签:

【中文标题】你能防止 Lua 中的短路评估吗?【英文标题】:Can you prevent short-circuit evaluation in Lua? 【发布时间】:2014-10-16 01:00:45 【问题描述】:

我正在开发一个允许用户输入 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,...),然后手动进行。但我认为值得检查一下是否有更好的方法。

【问题讨论】:

是否可以修改 Lua 源代码? 【参考方案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
   

【讨论】:

因为这是用户输入的,并且某些条件可能很少被检查,所以我绝对想一次性评估用户输入的所有值。我不想总是关闭所有东西的短路评估。我只想检查以确保他们检查的所有内容实际上都可用,拼写正确等。短路评估目前是一个障碍,除非我进行一些复杂的字符串解析来分解每个可能的嵌套条件。 或者只是编写一个测试函数,它会检查所有内容... bool test()logic1, logic2 ...【参考方案2】:

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

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

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

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

【讨论】:

我绝对同意关于麻烦的部分。 :)【参考方案3】:

我不确定是否有人的回答是准确的,但字面上的问题是“你能防止短路评估吗”,我无法找到一种方法来做到这一点。

我最终切碎了用户输入并单独测试了每个组件,收集这些错误并将它们反馈给用户。目前看来还可以。

【讨论】:

以上是关于你能防止 Lua 中的短路评估吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何防止 sns.countplot 中的 x 轴标签重叠

三元运算符可以等效于与逻辑运算符的短路吗?

有啥方法可以防止以角度破坏组件?

如何防止表格单元格(不是单个单元格)的列中的换行?

机器学习防止过拟合这是作弊吗?

防止多次执行 Lua 脚本