2017-08-30 140 views
0

我正在学习Akka Streams库,并且存在以下混淆。我看到一个隐式传递给GraphDSL.create()(...)调用的Graphbuilder对象。 我无法理解可用的实际生成器对象在哪里?在Akka Streams中传递的隐式GraphBuilder对象在哪里

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

回答

0

啊一看源代码就更清晰了。 调用者在函数中传入,而构建器的实例化是在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) 
    } 
1

builder不是从外部隐含需要的。如果你看看在create功能的签名

def create[S <: Shape]()(buildBlock: GraphDSL.Builder[NotUsed] ⇒ S): Graph[S, NotUsed] 

,你会发现,它仅需要从BuilderShape功能。实际上,如果您从代码中删除implicit关键字,则仍应编译create

但是,您需要让该构建器稍后在代码中隐式提供,特别是当您需要GraphDSL符号~>时。如果您检查~>

def ~>[U >: T](to: Inlet[U])(implicit b: Builder[_]): Unit 

签名,你会看到这是需要隐Builder地方。这就是为什么builder参数需要注释为implicit

+0

是啊,我也明白,但我想我是想明白是谁提供的实际建设者实例作为输入到程序?它是否可以通过执行'create'来实现? –