你能防止 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
的值如何),我可以向最终用户提供错误消息。
有什么想法吗?
我目前最好的想法是过滤用户输入,整理出每个输入的值(基本上,任何不是条件的or
,and
,...),然后手动进行。但我认为值得检查一下是否有更好的方法。
【问题讨论】:
是否可以修改 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 中的短路评估吗?的主要内容,如果未能解决你的问题,请参考以下文章