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)