防止返回最后评估表达式的最佳方法

时间:2013-07-08 23:13:57

标签: ruby

假设我想在ruby中编写一个方法,其最后一行是方法调用,但我不想返回它的返回值。除了在通话后添加nil之外,还有更优雅的方法来实现此目的吗?

def f(param)
    # some extra logic with param
    g(param) # I don't want to return the return of g
end

5 个答案:

答案 0 :(得分:6)

不,但是如果f确实返回nil而不是g(param)返回的内容很重要,那么没有什么比使用nil拼写更优雅了在最后一行。你为什么要混淆这个?大多数时候,优雅是显而易见的。

来自The Zen of Python的一些租户会想到:

  

明确比隐含更好   简单比复杂更好   可读性很重要。

答案 1 :(得分:5)

没有。如果要返回nil,则最后一个表达式必须求值为nil。您可以使用终止nil行或围绕nil.tap {}中的方法体或者您喜欢的其他方法来执行此操作,但这非常简单 - 将返回最后一个表达式。

答案 2 :(得分:4)

正如其他人所说,没有。但是,如果您想避免添加其他行,则有几个选项:

g(param); nil
g(param) && nil

第一个将始终导致f返回nil;第二个将返回false(如果g返回false)或nil(如果g返回真值)。

答案 3 :(得分:4)

如果你想让它“明白地捅你”,只要说“这种方法不会返回任何东西”:

def f(param)
    # some extra logic with param
    g(param) # I don't want to return the return of g
    return
end

f(x)仍将评估为nil,但裸return是一种明确的方式,可以说“此方法不会返回任何感兴趣的内容”,尾随nil表示“此方法显式返回nil”,这与不返回任何使用内容的方式完全相同。

答案 4 :(得分:0)

不,没有其他方法可以显式返回nil或评估隐式评估为nil的某些其他表达式(例如())。

如果你想添加一些显示你明确想要忽略返回值的语义标记,你可以为此创建一些约定,例如:

def f(param)
  # some extra logic with param
  g(param) # I don't want to return the return of g

  ()
end

def f(param)
  # some extra logic with param
  g(param) # I don't want to return the return of g

  _=_
end

这将使这些案件很容易grep能够,但可能不会对理解有太多帮助。

这是Ruby的设计选择,它与许多其他基于表达式的语言共享:块/子例程/过程/函数/方法的值是块内部计算的最后一个表达式的值。例如,这就是它在Lisp中的工作原理。

请注意,还有其他选择。例如。在Smalltalk中,必须使用运算符显式返回方法的返回值,否则返回值为nil。在E中,它主要关注安全性,这甚至是一种有意识的设计选择:自动返回最后一个表达式的值被认为是潜在的信息泄漏。