Akka 流 - 为什么 ActorSystem 只有在标记为隐式时才被接受为 Materalizer?
Akka streams - why is an ActorSystem accepted as a Materalizer only when it is marked as implicit?
我正在查看 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)
}
错误:
type mismatch;
found : akka.actor.ActorSystem
required: akka.stream.Materializer
source.runForeach(i => println(i))(system)
为什么以前可以,现在不行? source.runForeach
方法采用 Materalizer
类型,所以我想知道为什么它一开始就起作用了?据我所知,ActorSystem
不是 Materalizer
或其子类型,所以我很困惑。
这与 Scala 编译器如何将 ActorSystem
转换为 Materializer
有关
这是通过implicit conversions用下面的方法完成的
/**
* 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
。
因此拥有 implicit
键允许编译器在需要 Materializer
的实例时采用隐式角色系统,并且无需在其中显式定义实体化器即可完成此类转换范围。
我正在查看 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)
}
错误:
type mismatch; found : akka.actor.ActorSystem required: akka.stream.Materializer source.runForeach(i => println(i))(system)
为什么以前可以,现在不行? source.runForeach
方法采用 Materalizer
类型,所以我想知道为什么它一开始就起作用了?据我所知,ActorSystem
不是 Materalizer
或其子类型,所以我很困惑。
这与 Scala 编译器如何将 ActorSystem
转换为 Materializer
这是通过implicit conversions用下面的方法完成的
/**
* 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
。
因此拥有 implicit
键允许编译器在需要 Materializer
的实例时采用隐式角色系统,并且无需在其中显式定义实体化器即可完成此类转换范围。