2016-08-20 55 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返回的物化值圖表,從而改變回報類型。