1

假设我有这个代码

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
4

3 回答 3

3

这是同一件事的另一个变体

def foo
  if x = retval
    return x
  end
  ...
end

如果你只看语法,恐怕你不会得到截然不同的结果。此外,这有什么问题?

def foo
  ...
  x = retval
  return x if x
  ...
end

我就是这样写的。

于 2012-09-15T03:36:25.933 回答
0

您可以将结果存储在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
于 2012-09-15T03:34:54.363 回答
0

如果您正在寻找单线

return x if (x = retval)

仅在x已定义时才有效。

if x = retval; x; end

确实有效,但没有人真正那样写 Ruby。

根据你的情况,可能

return true if retval

有可能,还是您实际上要求返回的值retval返回?

更新:正如 OP 所说,需要返回值,Sergio 的回答是恕我直言正确。当然,还有另一种方法可以在表达式内部使用相当丑陋的赋值来制作单线:

x = retval and return x

哎呀!:-)

于 2012-09-15T03:36:44.963 回答