doc有以下示例(仅显示与我的问题相关的内容):
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
})
但是,这会将g.run()
的返回类型从Future[Int]
更改为akka.NotUsed
。为什么呢?
答案 0 :(得分:3)
我想我自己找到了答案。加。到文档:
使用builder.add(...),这个操作将复制 传递给它并返回其入口和出口的蓝图 生成的副本,以便它们可以连接起来。另一种选择 是将任何形状的现有图形传递到工厂方法中 生成一个新图。这些方法之间的区别在于 使用builder.add(...)导入忽略了物化的值 通过工厂方法导入时导入的图形允许它 夹杂物
g.run
返回图表的具体化值,从而返回返回类型的变化。