Ruby 防止返回上次计算表达式的最佳方法

Ruby 防止返回上次计算表达式的最佳方法,ruby,Ruby,假设我想用ruby编写一个方法,其最后一行是方法调用,但我不想返回它的返回值。除了在调用后添加一个nil之外,还有没有更优雅的方法来实现这一点 def f(param) # some extra logic with param g(param) # I don't want to return the return of g end 否。如果要返回nil,则最后一个表达式的计算结果必须为nil。您可以使用终止的nil行,或者通过在nil.tap{}中包围方法体,或者您喜欢的其

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

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

否。如果要返回nil,则最后一个表达式的计算结果必须为nil。您可以使用终止的
nil
行,或者通过在
nil.tap{}
中包围方法体,或者您喜欢的其他方式来实现这一点,但是它非常简单-返回最后计算的表达式。

否,但是如果重要的是
f
确实返回
nil
,而不是任何
g(参数)
返回,那么没有什么比在最后一行用
nil
拼写更优雅的了。你为什么要把它弄糊涂?在大多数情况下,优雅是在明确和明显

我脑海中浮现出几位房客:

显式优于隐式。
简单胜于复杂。
可读性很重要


正如其他人所说,没有。但是,如果您想避免添加另一行,您有两个选择:

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

第一个总是导致
f
返回nil;第二个将返回
false
(如果g返回false)或
nil
(如果g返回truthy值)。

否,除了显式返回
nil
或计算隐式计算为
nil
(例如
()
)的其他表达式之外,没有其他方法

如果您想添加某种语义标记,表明您明确希望忽略返回值,您可以为此发明一些约定,例如:

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中,这甚至是一个有意识的设计选择:自动返回最后一个表达式的值被认为是潜在的信息泄漏。

如果你想让它“戳你的眼睛”,只需说“此方法不返回任何东西”:


f(x)
的计算结果仍然是
nil
,但是一个简单的
return
是一种明确的方式,表示“此方法不返回任何感兴趣的内容”,后面的
nil
表示“此方法显式返回
nil
”这与不返回任何有用的东西并不完全相同。

也许您可以确定不返回值是必要的情况?至少,你可以忽略任何返回值。@JimPedid Tim Holt在这个问题上的回答是:stackoverflow.com/questions/1023146/…例如,如果方法被修改,其他地方使用的未记录的返回值可能会导致问题。Ruby确实有
return
你知道……我认为他建议只调用return(没有价值)def方法…返回end@JimPedid:对,只是一个简单的
返回值
,这是一个很好的显式方法,可以说一个方法不会返回任何有用的东西。python的禅宗在这些领域没有任何意义。毕竟,我们首先讨论的是隐式返回值。我正在寻找更多的显式方法来抑制g的返回而不是显式返回nil。@RyanHaining为什么不?仅仅因为它是Pythonic哲学的基础并不意味着它对其他语言也不适用/有用。不要因为“Python”而抛弃它“是名义上的,而不是Ruby。除#13之外的所有东西都适用于任何好的代码,我的意思是。@AndrewMarshall在我对Ruby的有限经验中,Ruby语言似乎不鼓励“显式优于隐式”的想法。我这样想是错的吗?当然,请注意,第二个例子(
=\ucode>)仅当您以前未定义名为
\uuu
的局部变量或方法,该变量或方法返回的不是
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
    return
end