假设我想在ruby中编写一个方法,其最后一行是方法调用,但我不想返回它的返回值。除了在通话后添加nil
之外,还有更优雅的方法来实现此目的吗?
def f(param)
# some extra logic with param
g(param) # I don't want to return the return of g
end
答案 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中,它主要关注安全性,这甚至是一种有意识的设计选择:自动返回最后一个表达式的值被认为是潜在的信息泄漏。