まず、特性内にval
とdef
を使用することの違いが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 = ...
あなたは今、テンプレートを作成しましたが、それは暗黙のシステムを供給するために、具体的な実装次第ですので、それは便利ですこれらのことが実行されると、必要な場所で定義された実装を持つことができるように、暗黙のうちに実際に暗黙的に指定することができます。
コメントが指摘しているように、最初の段落は間違っています:重要なことは、抽象メンバが 'val'または' def'として宣言されているかどうかではなく、 non-lazy 'val'sにアクセスする' def')。 –
@AlexeyRomanov正解、私は答えるために急いでおとぎ話を書いた:) – flavian