Function Lua(函数)中的三元算子
我在代码战中遇到了这样一个问题: 实现一个函数,该函数将根据布尔值运行两个不同的函数。当然,它可以使用简单的if语句实现。像这样: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
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