アトミック変数を設定する次のコードがあります(両方とも同じようjava.util.concurrent.atomicにmonix.execution.atomic動作します:
class Foo {
val s = AtomicAny(null: String)
def foo() = {
println("called")
/* Side Effects */
"foo"
}
def get(): String = {
s.compareAndSet(null, foo())
s.get
}
}
val f = new Foo
f.get //Foo.s set from null to foo, print called
f.get //Foo.s not updated, but still print called
2 回目の比較では、値は更新されませんでしたが、それでも foo が呼び出されます。副作用があるため、これは問題を引き起こしてfooいます (私の実際のコードでは、Akka アクターを作成し、重複したアクターを作成しようとするため、エラーが発生します)。
実際に使用されない限り、2 番目のパラメーターが評価されないようにするにはどうすればよいですか? (できれば同期を使用しないでください)
lazy val が機能しないように、暗黙のパラメーターを foo に渡す必要があります。例えば
lazy val s = get() //Error cannot provide implicit parameter
def foo()(implicit context: Context) = {
println("called")
/* Side Effects */
"foo"
}
def get()(implicit context: Context): String = {
s.compareAndSet(null, foo())
s.get
}