如何向字符串添加隐式方法

Cha*_*mar 2 scala akka

如何将隐式方法写入字符串以直接记录。

下面的代码工作正常:

case class Worker(name: String) extends Actor with ActorLogging {
      override def receive: Receive = {
        case string: String => log.info("string received")
        case _              => log.info("unknown message received")
      }
    }
Run Code Online (Sandbox Code Playgroud)

想要将 .log 隐式方法添加到字符串,它应该调用 log.info("message") ,如下所示:

case class Worker(name: String) extends Actor with ActorLogging {
  override def receive: Receive = {
    case string: String => "string received".log
    case _              => "unknown message received".log
  }
}
Run Code Online (Sandbox Code Playgroud)

Krz*_*sik 5

也许是这样的?

trait LoggableString {this: ActorLogging =>

  private val logger = log //since there's name collision, we need to capture log method

  implicit class RichString(s: String) {
    def log() = logger.info(s)
  }

}

class MyActor extends Actor with ActorLogging with LoggableString {

  override def receive: Receive = {
    case msg => "Hello".log
  }
}
Run Code Online (Sandbox Code Playgroud)

或 Alexey Romanov 建议的另一种解决方案:

trait ExtendedActorLogging extends ActorLogging {this: Actor =>

  private val logger =  log

  implicit class RichString(s: String) {
    def log() = logger.info(s)
  }

}

class MyActor extends Actor with ExtendedActorLogging {

  override def receive: Receive = {
    case msg => "Hello".log
  }
}
Run Code Online (Sandbox Code Playgroud)