Function Lua(函数)中的三元算子

Function Lua(函数)中的三元算子,function,lua,ternary-operator,Function,Lua,Ternary Operator,我在代码战中遇到了这样一个问题: 实现一个函数,该函数将根据布尔值运行两个不同的函数。当然,它可以使用简单的if语句实现。像这样: function _if(bool, func1, func2) if bool then return func1() else return func2() end end 但是,当我想使用三元运算符求解它时,它并没有通过所有测试用例: function _if(bool, func1, func2) return bool and fun

我在代码战中遇到了这样一个问题:

实现一个函数,该函数将根据布尔值运行两个不同的函数。当然,它可以使用简单的if语句实现。像这样:

function _if(bool, func1, func2) 
    if bool then return func1() else return func2() end
end
但是,当我想使用三元运算符求解它时,它并没有通过所有测试用例:

function _if(bool, func1, func2) 
    return bool and func1() or func2()
end
但这是可行的:

function _if(bool, func1, func2) 
    return (bool and func1 or func2)()
end
我想我对Lua没有足够的了解。我已经在社区里搜索过了,但是找不到任何关于这个的明确解释。我想知道是否有人可以解释一下这一点,或者只是建议一些文章来帮助我理解

更新 编辑


那么,如果
func1
始终返回truthy值,那么第二个代码段与第三个代码段有何不同?

如果
版本与使用
的第二个代码段不等效

如果func1()返回false,则计算
部分并返回func2()的结果


最后一个函数有效(当func1不是
nil
时),因为您在确定要调用哪个函数后调用了该函数。因此,
bool
只需选择下一步调用哪个函数的“指针”。假设
func1
不是
nil
,指针将永远不会为false。

如果
版本与使用
的第二个版本不同,则
版本将不会为false

如果func1()返回false,则计算
部分并返回func2()的结果


最后一个函数有效(当func1不是
nil
时),因为您在确定要调用哪个函数后调用了该函数。因此,
bool
只需选择下一步调用哪个函数的“指针”。假设
func1
不是
nil
,指针将永远不会为false。

代码中存在几个潜在问题。 1.如前所述,如果
func1
返回任何
falsy
值,则将调用
func2

2.
bool和func1()或func2()只返回一个结果。

代码中存在几个潜在问题。
function _if(bool, func1, func2) 
    if bool then return func1() else return func2() end
end
1.如前所述,如果
func1
返回任何
falsy
值,则将调用
func2
。 2.
bool和func1()或func2()
只返回一个结果

function _if(bool, func1, func2) 
    if bool then return func1() else return func2() end
end
如果bool为true,则上述代码返回func1(),否则返回func2()

如果
bool
为非真或
bool
为真且
func1()
为非真,则以下代码将返回
func2()
。仅当
bool
func1()
都为真时,它才会返回
func1()

function _if(bool, func1, func2) 
    return bool and func1() or func2()
end
如果bool为true,则最后一段代码将返回func1(),否则返回func2()


首先,Lua没有任何三元运算符。巧妙地使用and的优先级高于or,只是相当于C等三元运算符:

其次,表达式
a=b和c或d只有在c为真时才能正常工作。如果将函数调用用作c,则情况可能并非总是如此

这是一种完成作业的便捷方式,但在许多情况下,只要坚持使用if-else语句,就可以提高可读性并减少错误

一旦你不得不添加更多的条件,和或技巧就会变得一团糟

让我们再看看第二段中发生了什么

function _if(bool, func1, func2) 
    return bool and func1() or func2()
end
首先计算
bool
func1()
。 如果
bool
不为true,则Lua不必调用
func1()
,因为表达式永远不可能为true。 所以Lua可以马上去计算
func2()
。 您的函数将返回
func2()

相反,如果
bool
true
,Lua将调用
func1()
,查看它是否也为
true
。 如果
func1()
返回
true
,Lua将不会调用
func2()
。由于以下原因,如果
bool
func1()
true
,则表达式将始终为
true
。 如果
func1()
返回false/nil,则必须计算
。因此Lua也将调用
func2()
,然后返回它的返回值

重要的是要知道运算符优先级,以及在什么情况下Lua将中止计算表达式

Lua的
操作符使用捷径评估。第二个操作数仅在必要时计算

如果bool为true,则上述代码返回func1(),否则返回func2()

如果
bool
为非真或
bool
为真且
func1()
为非真,则以下代码将返回
func2()
。仅当
bool
func1()
都为真时,它才会返回
func1()

function _if(bool, func1, func2) 
    return bool and func1() or func2()
end
如果bool为true,则最后一段代码将返回func1(),否则返回func2()


首先,Lua没有任何三元运算符。巧妙地使用and的优先级高于or,只是相当于C等三元运算符:

其次,表达式
a=b和c或d只有在c为真时才能正常工作。如果将函数调用用作c,则情况可能并非总是如此

这是一种完成作业的便捷方式,但在许多情况下,只要坚持使用if-else语句,就可以提高可读性并减少错误

一旦你不得不添加更多的条件,和或技巧就会变得一团糟

让我们再看看第二段中发生了什么

function _if(bool, func1, func2) 
    return bool and func1() or func2()
end
首先计算
bool
func1()
。 如果
bool
不为true,则Lua不必调用
func1()
,因为表达式永远不可能为true。 所以Lua可以马上去计算
func2()
。 您的函数将返回
func2()

相反,如果
bool
tru