Как автоматически вызывать метод при создании класса дела - PullRequest
0 голосов
/ 06 июня 2018

Я добавляю вход в свое приложение Play, и чтобы избежать громоздкого и повторяющегося кода, я создал класс case с функцией форматирования внутри для очистки моих журналов:

final case class LogMessage(keyValuePairs: (String, String)*) {
  def jsonify: String =
    s"""{${keyValuePairs map { case (key, value) => s""""$key":"$value"""" } mkString "," }}"""
}

В настоящее время, чтобы вызвать этот метод, я должен сделать что-то вроде:

Logger.info(LogMessage(("message", s"here is my message")).jsonify)
// jsonify prints:
// {"message":"here is my message"}

Это работает нормально, но мне не нравится, как мне нужно писать .jsonify после того, как я создаю новый класс case,Есть ли способ сделать этот метод автоматически вызываемым при создании класса LogMessage, чтобы у меня не было написано jsonify во всем моем коде?Я читал о неявных методах, но простое изменение метода на implicit def jsonify = ... ничего не делает.

1 Ответ

0 голосов
/ 06 июня 2018

Это можно решить путем переопределения toString метода LogMessage, но есть и лучший вариант.

Поскольку на самом деле нет необходимости использовать экземпляры LogMessage, мы можем реализоватьobject с его apply() методом, который будет служить преобразователем из кортежей в jsonified String:

object JsonifiedMessage {

  def apply(keyValuePairs: (String, Any)*): String = {
    val jsonified = keyValuePairs.map { case (key, value) => s""""$key":"$value"""" }.mkString(",")
    s"{${jsonified}}"
  }

} 

Может использоваться как:

Logger.info(JsonifiedMessage(("a", 1), ("b", 2)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...