1

このコードがあるとします

def retval
  # some resource intensive computation
  return whatever
end

def foo
  ...
  return retval if retval
  ...
end

実行せずに retval が 2 回呼び出されないように再構築する方法はありますか

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 に答える