このコードがあるとします
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
これは同じものの別のバリエーションです
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
うわぁ!:-)