これは本当にあなたの質問に対する答えではなく、人々がこれを行うときは嫌いですが、とにかくそれをやろうとしています。私は最良のレスポンスは次のようなものだと考えています:怠惰なvalはこれには適切ではないので、必要なものをサポートする型を定義してください。
あなたはoptionalSubsystem()
ではなくoptionalSubsystem
として変数を参照する必要がありますが、それはその参照を取得することobservably副作用の手順である、なぜならあなたが望むデザインで、Aグッドシングです。
class Lazy[A](f: => A, private var option: Option[A] = None) {
def apply(): A = option match {
case Some(a) => a
case None => val a = f; option = Some(a); a
}
def toOption: Option[A] = option
}
scala> val optionalSubsystem = new Lazy { "a" }
optionalSubsystem: Lazy[java.lang.String] = [email protected]
scala> optionalSubsystem.toOption.isDefined
res1: Boolean = false
scala> optionalSubsystem()
res2: java.lang.String = a
scala> optionalSubsystem.toOption.isDefined
res12: Boolean = true
編集 - ここでトマスMikulaのおかげで、いくつかの変更を加えて別のリビジョンです:
import scala.language.implicitConversions
object Lazy {
def lazily[A](f: => A): Lazy[A] = new Lazy(f)
implicit def evalLazy[A](l: Lazy[A]): A = l()
}
class Lazy[A] private(f: => A) {
private var option: Option[A] = None
def apply(): A = option match {
case Some(a) => a
case None => val a = f; option = Some(a); a
}
def isEvaluated: Boolean = option.isDefined
}
これはあなたの代わりにoptionalSubsystem()
のlazily { ... }
代わりのnew Lazy { ... }
、およびoptionalSubsystem
を書き込むことができます。
scala> import Lazy._
import Lazy._
scala> val optionalSubsystem = lazily { "a" }
optionalSubsystem: Lazy[String] = [email protected]
scala> optionalSubsystem.isEvaluated
res0: Boolean = false
scala> optionalSubsystem: String
res1: String = a
scala> optionalSubsystem.isEvaluated
res2: Boolean = true
いいえ、optionalSubsystemを起動するかどうかを決定するにはどうすればよいですか?ランタイム情報ですか?またはコンパイル時の情報? – stew
すべての実行時。私は方法を見つけた: 'optionalSubsystem'は副作用を持っている - それは俳優を起動する。これがより良い答えになるまで、私は副作用をチェックする。 –
"Akkaの俳優を起動します。俳優が起動した場合は、監督したいと思います"。このユースケースは、あなたが本当に知りたいことであれば、質問に記載する必要があります。 –