Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 其中是Akka Streams中传递的隐式GraphBuilder对象_Scala_Akka Stream - Fatal编程技术网

Scala 其中是Akka Streams中传递的隐式GraphBuilder对象

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

我正在学习Akka Streams图书馆,有以下困惑。我看到一个Graphbuilder对象隐式地传递给GraphDSL.create()(…)调用。 我无法理解实际的生成器对象从何处可用

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