STM-Ref.transform
STM - Ref.transform
根据文档(据我了解),"transform" 应该将函数应用于 Ref-container 内的元素。
在下面的示例中:为什么第二个原子表达式的输出为空,而第一个实际有效?我希望输出 "HELLO".
import scala.concurrent.stm._
val ref = Ref[String]("hello")
atomic {
implicit txn =>
println(ref())
} //> hello
atomic {
implicit txn =>
val uppercase = ref.transform(a => a.toUpperCase)
println(uppercase)
} //> ()
首先,您不应该在 atomic
块内执行任何 IO(或其他副作用)操作。在成功(或失败)之前,该块可能会执行多次。
transform
的类型签名是 transform(f: (A) ⇒ A)(implicit txn: InTxn): Unit
。它转换 Ref
的值但不转换 return 新(或旧)值。
这会起作用:
val value = atomic { implicit txn =>
ref.transform(a => a.toUpperCase)
ref.get
}
println(value)
根据文档(据我了解),"transform" 应该将函数应用于 Ref-container 内的元素。
在下面的示例中:为什么第二个原子表达式的输出为空,而第一个实际有效?我希望输出 "HELLO".
import scala.concurrent.stm._
val ref = Ref[String]("hello")
atomic {
implicit txn =>
println(ref())
} //> hello
atomic {
implicit txn =>
val uppercase = ref.transform(a => a.toUpperCase)
println(uppercase)
} //> ()
首先,您不应该在 atomic
块内执行任何 IO(或其他副作用)操作。在成功(或失败)之前,该块可能会执行多次。
transform
的类型签名是 transform(f: (A) ⇒ A)(implicit txn: InTxn): Unit
。它转换 Ref
的值但不转换 return 新(或旧)值。
这会起作用:
val value = atomic { implicit txn =>
ref.transform(a => a.toUpperCase)
ref.get
}
println(value)