2015-01-26 4 views
0

설명서에 따르면 "변환"은 Ref 컨테이너 안의 요소에 함수를 적용해야합니다.STM - Ref.transform

다음 예제에서 첫 번째 원자 표현식이 실제로 작동하는 동안 두 번째 원자 표현식의 출력이 비어있는 이유는 무엇입니까? 나는 출력 "안녕하세요"를 기대할 것이다. 모든

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) 
}           //>() 

답변

1

첫째, 당신은 atomic 블록 내부의 IO (또는 다른 측면 영향을 미치는 점수) 작업을해서는 안된다. 블록은 여러 번 실행되어 성공 (또는 실패) 될 수 있습니다.

transform의 유형 서명은 transform(f: (A) ⇒ A)(implicit txn: InTxn): Unit입니다. Ref 값을 변환하지만 새 값 (또는 이전 값)은 반환하지 않습니다.

이 작동합니다 :

val value = atomic { implicit txn => 
    ref.transform(a => a.toUpperCase) 
    ref.get 
} 
println(value) 
관련 문제