在使用结果前检查函数的返回值

    placeholder = f()
    if placeholder then return placeholder end

这感觉不太优雅,在两行中使用这么多单词完成一个简单的任务感觉很奇怪。有没有更简洁/“更好”的写法?

其中一个有用的示例是:

    for f in pairs(listOfFunctions) do
        placeholder = f()
        if placeholder then return f() end
    end
点赞
用户2226988
用户2226988

背景:

  • 函数可以有任意数量的返回语句,返回任意数量的值,并且可以在调用中变化。
  • or 是选择器运算符:它返回第一个非“错乱”的操作数。(除非需要,否则不评估第二个操作数表达式。)
  • 产生列表的表达式在列表环境中保留整个列表(例如列表中的最后一个表达式,例如 return 语句),但在非列表环境中仅返回第一个值(例如在括号内)。

不清楚您想要在哪些条件下返回 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

如果您发现在代码的这一点上有一个无条件的返回不方便,那么您需要重构您的控制流,并且实际上可能会受益于更少的控制流。

2016-11-18 01:27:07