Scala 其中是Akka Streams中传递的隐式GraphBuilder对象
我正在学习Akka Streams图书馆,有以下困惑。我看到一个Graphbuilder对象隐式地传递给GraphDSL.create()(…)调用。 我无法理解实际的生成器对象从何处可用Scala 其中是Akka Streams中传递的隐式GraphBuilder对象,scala,akka-stream,Scala,Akka Stream,我正在学习Akka Streams图书馆,有以下困惑。我看到一个Graphbuilder对象隐式地传递给GraphDSL.create()(…)调用。 我无法理解实际的生成器对象从何处可用 val g = RunnableGraph.fromGraph(GraphDSL.create() { implicit builder: GraphDSL.Builder[NotUsed] => import GraphDSL.Implicits._ val in = Source(1 to
val g = RunnableGraph.fromGraph(GraphDSL.create() { implicit builder: GraphDSL.Builder[NotUsed] =>
import GraphDSL.Implicits._
val in = Source(1 to 10)
val out = Sink.ignore
val bcast = builder.add(Broadcast[Int](2))
val merge = builder.add(Merge[Int](2))
val f1, f2, f3, f4 = Flow[Int].map(_ + 10)
in ~> f1 ~> bcast ~> f2 ~> merge ~> f3 ~> out
bcast ~> f4 ~> merge
ClosedShape
})
builder
不是从外部隐式需要的。如果查看create
函数的签名
def create[S <: Shape]()(buildBlock: GraphDSL.Builder[NotUsed] ⇒ S): Graph[S, NotUsed]
您将看到这就是需要隐式
生成器的地方。这就是为什么需要将builder
参数注释为implicit
啊,查看源代码可以让它更清晰。
调用方传入函数,而生成器的实例化是从create
函数内部完成的
从akka/stream/scaladsl/GraphApply.scala.template中
def create[S <: Shape]()(buildBlock: GraphDSL.Builder[NotUsed] ⇒ S): Graph[S, NotUsed] = {
val builder = new GraphDSL.Builder
val s = buildBlock(builder)
val mod = builder.module.replaceShape(s)
new GraphApply.GraphImpl(s, mod)
}
def create[S是的,我确实理解这一点,但我想我试图理解的是,谁提供了实际的构建器实例作为程序的输入?它是否由create
的实现提供?
def create[S <: Shape]()(buildBlock: GraphDSL.Builder[NotUsed] ⇒ S): Graph[S, NotUsed] = {
val builder = new GraphDSL.Builder
val s = buildBlock(builder)
val mod = builder.module.replaceShape(s)
new GraphApply.GraphImpl(s, mod)
}