Ich habe Mühe, die Idee von implicit
in Scala auf Akka Streams anzuwenden.Akka Streams: Warum muss der GraphDSL.Builder als implizit markiert werden?
Nach http://docs.scala-lang.org/overviews/core/implicit-classes.html, das Grundkonzept einer implicit
Klasse in Scala ist, dass für 5 times prinln("foo")
ein Objekt von IntWithTimes
erstellt wird, die Methode zu machen times
implizit verfügbar durch Helpers._
importieren.
object Helpers {
implicit class IntWithTimes(x: Int) {
def times[A](f: => A): Unit = {
def loop(current: Int): Unit =
if(current > 0) {
f
loop(current - 1)
}
loop(x)
}
}
}
wir folgendes Beispiel:
val g = RunnableGraph.fromGraph(GraphDSL.create() {
implicit builder: GraphDSL.Builder[Unit] =>
import GraphDSL.Implicits._
val in = Source(1 to 100)
val flow = Flow[Int].map(_ + 1)
val out = Sink.foreach(println)
in ~> flow ~> out
ClosedShape
})
g.run()
Offensichtlich ist neu in Scala und Akka, meine unbefriedigende Theorie ist so weit, dass create()
von GraphDSL
mit einem RunnableGraph
schafft die Builder
hinein, indem.
Warum muss es als implicit
markiert werden? Wenn sie weg sind, können die Operatoren ~>
nicht mehr aufgelöst werden - obwohl GraphDSL.Implicits._
explizit importiert wird.
Danke sehr viel zu dieser ausführlichen Erklärung! Ich habe nicht genug darauf geachtet, dass die implizite Konvertierung den Builder als (impliziten) Parameter benötigt. Danke, dass du das unterstrichen hast! – Toaditoad