2017-05-18 25 views

答えて

4

まず、特性内にvaldefを使用することの違いがScalaにあることについて説明します。 here

このパターンは、あなたの形質に具体的な実装が含まれている場合に使用しますが、あなたの特性の最終的な実装者はそれらのimplicitsの具体的な値を指定する必要があります。

trait MyXXXProtocol extends Logging { 

    implicit def actor: ActorSystem 
    implicit def materializer: Materializer 
    implicit def executor: ExecutionContextExecutor 

    def test(input: String): Unit = { 
    // let's pretend this is valid 
    actor.props("bla").send(input) 
    } 

例えばsendの署名はこのようなものである場合、これは便利になり:

def send(input: String)(
    implicit system: ActorSystem, 
    materializer: FlowMaterializer 
): Unit = ... 

あなたは今、テンプレートを作成しましたが、それは暗黙のシステムを供給するために、具体的な実装次第ですので、それは便利ですこれらのことが実行されると、必要な場所で定義された実装を持つことができるように、暗黙のうちに実際に暗黙的に指定することができます。

+0

コメントが指摘しているように、最初の段落は間違っています:重要なことは、抽象メンバが 'val'または' def'として宣言されているかどうかではなく、 non-lazy 'val'sにアクセスする' def')。 –

+0

@AlexeyRomanov正解、私は答えるために急いでおとぎ話を書いた:) – flavian

関連する問題