假设我有这个代码
def retval
# some resource intensive computation
return whatever
end
def foo
...
return retval if retval
...
end
有没有办法重组这样 retval 不会被调用两次,而不做
def foo
...
x = retval
return x if x
...
end
这是同一件事的另一个变体
def foo
if x = retval
return x
end
...
end
如果你只看语法,恐怕你不会得到截然不同的结果。此外,这有什么问题?
def foo
...
x = retval
return x if x
...
end
我就是这样写的。
您可以将结果存储在retval
:
def retval
return @retval if @retval
# some resource intensive computation
@retval = whatever
end
def foo
...
return retval if retval
...
end
对于较短的方法,一个很好的习惯用法是:
def retval
@somevar ||= some_work
end
如果您正在寻找单线
return x if (x = retval)
仅在x
已定义时才有效。
if x = retval; x; end
确实有效,但没有人真正那样写 Ruby。
根据你的情况,可能
return true if retval
有可能,还是您实际上要求返回的值retval
返回?
更新:正如 OP 所说,需要返回值,Sergio 的回答是恕我直言正确。当然,还有另一种方法可以在表达式内部使用相当丑陋的赋值来制作单线:
x = retval and return x
哎呀!:-)