Я стараюсь применить идею implicit
в Scala to Akka Streams.Akka Streams: Почему GraphDSL.Builder должен быть помечен как неявный?
Согласно http://docs.scala-lang.org/overviews/core/implicit-classes.html, основная концепция implicit
класса в Scala является то, что для 5 times prinln("foo")
объект IntWithTimes
создается, что делает метод times
неявно доступный через импортирование Helpers._
.
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)
}
}
}
Давайте рассмотрим следующий пример:
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()
Очевидно быть новым для Scala и Акку, моя неудовлетворителен теория до сих пор является то, что с помощью create()
из GraphDSL
создает RunnableGraph
пропусканием Builder
в него.
Почему он должен быть помечен как implicit
? Если это не указано, операторы ~>
больше не могут быть разрешены, даже если GraphDSL.Implicits._
явно импортирован.
Спасибо очень много для этого подробного объяснения! Я не обращал достаточного внимания, чтобы понять, что для неявного преобразования требуется, чтобы строитель был как (неявный) параметр. Спасибо что подметил это! – Toaditoad