我正在查看 akka 流快速入門教程,我想了解一段代碼是如何作業的。示例中的以下代碼將 1 到 100 的值列印到控制臺:
import akka.stream.scaladsl._
import akka.{Done, NotUsed}
import akka.actor.ActorSystem
object Akka_Streams extends App{
implicit val system: ActorSystem = ActorSystem("QuickStart")
val source: Source[Int, NotUsed] = Source(1 to 100)
source.runForeach(i => println(i))
}
我不明白的是,當我將代碼更改為以下并洗掉隱式時,代碼不再起作用。我收到型別不匹配錯誤(如下代碼所示):
object Akka_Streams extends App{
val system: ActorSystem = ActorSystem("QuickStart")
val source: Source[Int, NotUsed] = Source(1 to 100)
source.runForeach(i => println(i))(system)
}
錯誤:
型別不匹配; 找到:akka.actor.ActorSystem 需要:akka.stream.Materializer source.runForeach(i => println(i))(system)
為什么以前可以,現在不行?該source.runForeach方法采用一種Materalizer型別,所以我想知道為什么這根本就起作用?據我所知, anActorSystem不是它的一個Materalizer或一個子型別,所以我很困惑。
uj5u.com熱心網友回復:
它與 Scala 編譯器如何轉換ActorSystem為Materializer
它是通過使用以下方法的隱式轉換完成的
/**
* Implicitly provides the system wide materializer from a classic or typed `ActorSystem`
*/
implicit def matFromSystem(implicit provider: ClassicActorSystemProvider): Materializer =
SystemMaterializer(provider.classicSystem).materializer
它要求引數provider為implicit。
因此,擁有implicitkey 允許編譯器在需要 a 的實體時采用隱式actor系統Materializer,并且無需在范圍內顯式定義物化器即可完成此類轉換。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/459735.html
