2016-08-20 56 views
2

doc具有下面的例子(只什么有关我的问题是所示):阿卡流:无参数GraphDSL.create()VS GraphDSL.create(汇)

val resultSink = Sink.head[Int] 

val g = RunnableGraph.fromGraph(GraphDSL.create(resultSink) { implicit b => sink => 
    import GraphDSL.Implicits._ 

    // importing the partial graph will return its shape (inlets & outlets) 
    val pm3 = b.add(pickMaxOfThree) 

    Source.single(1) ~> pm3.in(0) 
    Source.single(2) ~> pm3.in(1) 
    Source.single(3) ~> pm3.in(2) 
    pm3.out ~> sink.in 
    ClosedShape 
}) 

我很好奇,为什么水槽必须被传递作为参数来GraphDSL.create所以我修改的例子中略微

val resultSink = Sink.head[Int] 

val g = RunnableGraph.fromGraph(GraphDSL.create() { implicit b => 
    import GraphDSL.Implicits._ 

    // importing the partial graph will return its shape (inlets & outlets) 
    val pm3 = b.add(pickMaxOfThree) 
    val s = b.add(resultSink).in 

    Source.single(1) ~> pm3.in(0) 
    Source.single(2) ~> pm3.in(1) 
    Source.single(3) ~> pm3.in(2) 

    pm3.out ~> s 

    ClosedShape 
}) 

然而,这种改变从Future[Int]akka.NotUsedg.run()返回类型。为什么?

回答

3

我想我自己找到了答案。加。到DOC:

使用builder.add(...),操作,这将使传递给它的 蓝图的副本,并返回 的入口和出口所产生的副本,以便他们可以连线。另一种替代 是将现有的图形 - 任何形状 - 传递给工厂方法,即 生成新图形。这些方法之间的差别在于 导入使用builder.add(...)忽略 进口图的物化值,而经由工厂方法导入允许其 列入

g.run返回的物化值图表,从而改变回报类型。