trait MyXXXProtocol extends Logging {
implicit def actor: ActorSystem
implicit def materializer: Materializer
implicit def executor: ExecutionContextExecutor
}
任何例子都会有所帮助。
答案 0 :(得分:4)
首先阅读本文,其中讨论了在特征中使用val
和def
之间的区别在于Scala。 here
当你的特性包含依赖于这些暗示的某种特定的具体实现时,你会使用该模式,但是你希望你的特征的最终实现者能够为那些暗示指定具体的值。
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 = ...
它很有用,因为你现在已经创建了一个模板,但是由具体的实现者来提供这些东西将要执行的隐式系统,你转发那些暗示,以便你可以在需要的地方定义一些实现,但是你可以稍后提供一个真实的隐含。