【问题标题】:checking return value of function before using result在使用结果之前检查函数的返回值
【发布时间】:2017-04-01 17:33:25
【问题描述】:
    placeholder = f()
    if placeholder then return placeholder end

这感觉很不雅,用这么多单词用两行做这么简单的任务感觉很奇怪。有没有更简洁/“更好”的方式来写这个?

一个有用的例子是:

    for f in pairs(listOfFunctions) do
        placeholder  = f()
        if placeholder then return f() end
    end

【问题讨论】:

  • 没有捷径。这就是 Lua 的本质。
  • 你能举一个更大的例子,更多的上下文吗?如果这是你的整个函数体,考虑到“else”分支无论如何都是虚无的,它可以很容易地简化为return f()return f() or nil(如果你想避免返回false)。 return f() or (function () return .... end)() 可用于创建瀑布,但这有点难看。一般来说,不,没有办法'return result only if result'.
  • 你想要高效的代码还是漂亮的代码?

标签: function lua


【解决方案1】:

背景:

  • 函数可以有任意数量的返回语句,这些语句返回任意数量的值,并且可以因调用而异。
  • or 是一个选择器运算符:它返回第一个非“假”操作数。 (除非需要,否则不会计算第二个操作数表达式。)
  • 产生列表的表达式将整个列表保留在列表上下文中(例如,列表中的最后一个表达式,如 return 语句),但仅保留非列表上下文中的第一个值(例如,在括号)。

目前尚不清楚您要退回哪些退货清单以及在什么条件下退货。你所展示的似乎是如果 f() 返回一个列表,其第一个值既不是nil 也不是false,返回那个值;否则返回一个空列表。

但有时,如果您返回具有多余值的列表并不重要,尤其是仅包含 nil 的列表而不是空列表。其他时候,每次返回相同数量的值很有用。

所以,这里有一些替代方案。

返回 f() 的结果列表中的所有值

return f()

或者,只返回 f() 的结果列表中的第一个值,nil 如果没有则

return (f())

或者,如果f()的结果列表中的第一个值既不是nil也不是false,则返回,否则返回nil

return f() or nil

或者,如果 f() 的结果列表中的第一个值既不是nil 也不是false,则返回,否则返回false

return f() or false

如果您发现在代码中此时无条件返回很尴尬,则需要重新构建控制流——事实上,无论如何,可能会从较少的控制流中受益。

【讨论】:

  • 你想不明白,我想要么:返回f()或继续,不返回f()false/nil
  • 是的,这就是为什么我建议您可能必须重组未显示的代码。
  • 您现在显示的代码非常紧密地包装在所需的控制流中,因此我看不到任何直接的改进。 Monad 风格的值和函数可能会导致某个地方,但这将是一个更大的变化并且可能毫无意义。
猜你喜欢
  • 1970-01-01
  • 2021-08-15
  • 1970-01-01
  • 1970-01-01
  • 2021-09-06
  • 1970-01-01
  • 1970-01-01
  • 2015-02-24
  • 2019-05-05
相关资源
最近更新 更多