Как я могу обернуть универсальный метод вокруг универсального метода в scala?

Я пытаюсь обернуть синтаксический анализатор spray-json так, чтобы он возвращал Option, а не выдавал исключение.

В качестве первого шага я просто пытаюсь обернуть метод своим собственным, но у меня возникают проблемы с его обобщением.

Парсер использует неявный объект формата (который определен для конкретного типа, который я использую), но когда метод является универсальным, компилятор жалуется:

[error]     Cannot find JsonReader or JsonFormat type class for T
[error]     def parse[T](s: String): T = JsonParser(s).convertTo[T]

Вот соответствующий код:

case class Person(name: String)

object Protocols {
  implicit val personFormat = jsonFormat1(Person)
}

import spray.json._

object Parser {
  import com.rsslldnphy.json.Protocols._
  // JsonParser(s).convertTo[Person] works fine, but..
  def parse[T](s: String): T = JsonParser(s).convertTo[T]  // .. doesn't
}  

Что мне нужно сделать, чтобы заставить это работать?


person Russell    schedule 10.11.2012    source источник


Ответы (1)


Вам нужно передать требуемое неявное значение, что удобно сделать, используя сокращенную нотацию «контекстная привязка»:

def parse[T : JsonReader](s: String): T =
  JsonParser(s).convertTo[T]

Это эквивалентно:

def parse[T](s: String)(implicit reader: JsonReader[T]): T =
  JsonParser(s).convertTo[T]

См. Что такое контекст, связанный в Scala?

person Régis Jean-Gilles    schedule 10.11.2012
comment
Ас, спасибо за это! Не уверен, что я поклонник сокращенной нотации, поэтому я думаю, что буду придерживаться более явной, неявной, так сказать. - person Russell; 11.11.2012
comment
Я бы посоветовал вам привыкнуть к этой нотации, так как она распространена в идиоматическом коде Scala. И на самом деле эта запись имеет большой смысл, если вы думаете о JsonReader как о классе типов. См. stackoverflow.com /вопросы/5408861/ - person Régis Jean-Gilles; 11.11.2012
comment
Я не обязательно хочу писать идиоматический код Scala. На мой взгляд, Scala несколько раз проигрывает краткости, а не ясности, и это один из них. - person Russell; 11.11.2012