scala - 如何将隐式方法添加到字符串
问题描述
如何将隐式方法写入字符串以直接记录。
下面的代码工作正常:
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")
}
}
想要将 .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
}
}
解决方案
也许是这样的?
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
}
}
或者 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
}
}