2016-12-02 2 views
0

私はScalaのimplicitのアイデアをAkka Streamsに適用するのに苦労します。Akka Streams:なぜGraphDSL.Builderを暗黙的にマークする必要がありますか?

http://docs.scala-lang.org/overviews/core/implicit-classes.htmlによると、Scalaではimplicitクラスの基本的な考え方は、Helpers._をインポートして方法timesが暗黙的に利用できるよう、5 times prinln("foo")ためIntWithTimesのオブジェクトが作成されていることです。

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とアッカ、自分の満足のいかない理論に新しいものGraphDSLcreate()を使用すると、それにBuilderを渡すことによってRunnableGraphを作成することです。

なぜimplicitとマークする必要がありますか?たとえGraphDSL.Implicits._が明示的にインポートされていても、除外された場合、~>演算子はもう解決できません。

答えて

2

implicitには、Scalaで複数の使用例があります。そのうちの1つは、暗黙のクラスです。しかし、implicit parametersimplicit conversionsもあります。私はそれらを読んでおくことをお勧めします、それはこの答えの範囲のために少しですが、不必要に情報を複製します。ただし、暗黙のクラスはほとんどがsyntactic sugar for a class with an implicit conversionなので、同じように機能します。

GraphDSL.Implicits._が明示的にインポートされていても、〜>演算子はもう解決できません。

これは~>を実際に定義されFlowOpsに暗黙変換をインポートします。この時点で、Scalaは変換について知っています。しかし、これを実際に実行するには暗黙のパラメータb : Builder[_]が必要です。 Implicitsに変換定義を見てみましょう:

implicit def fanOut2flow[I, O](j: UniformFanOutShape[I, O])(implicit b: Builder[_]): PortOps[O] 

今、あなたは暗黙的およびスカラ座などの任意Builder[_]をマークすることができ、それが欠けている場合は、自動的にあなたのために、このパラメータを記入します。 Builderからimplicitキーワードを削除すると、このパラメータを埋めるために暗黙の値が使用できなくなります。つまり、変換が実行されず、その後メソッド~>が使用できなくなります。

あなたは(全体の暗黙のパラメータの機能を取り囲む)手動で暗黙の型変換を呼び出し、欠落しているパラメータで自分を埋めるためにしかし自由であるが、これは比較して冗長/非常に醜いになります

in ~> // .. and so on 
// would become 
fanOut2flow(in)(builder) ~> // .. and so on 
+0

は、非常にありがとうこの詳細な説明の多く!私は暗黙的な変換が(暗黙の)パラメータとしてビルダーを必要とすることに気づくのに充分注意を払っていませんでした。それを指摘してくれてありがとう! – Toaditoad

関連する問題