неявное значение не применяется в области видимости

Я пытаюсь импортировать неявное объявление Write из встроенного объекта в функцию, которая создает объект JSON на основе набора классов case.

case class TestModel(test:String)

object TestModel {

  def manyToJSON(models: List[TestModel]) = {
    import writes.micro
    Json.toJson(models) 
  }

  object writes {
    implicit val micro = Json.writes[TestModel]
  }
}

к сожалению, компилятор scala жалуется:

Не найден сериализатор Json для типа List[models.TestModel]. Попробуйте реализовать неявную запись или формат для этого типа.

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

object TestModel {

  def manyToJSON(models: List[TestModel]) = {
    import writes.micro
    writes.micro
    Json.toJson(models) 
  }

  object writes {
    implicit val micro = Json.writes[TestModel]
  }
}

как мне изменить свой код, чтобы иметь неявный объем?


person magegu    schedule 30.07.2014    source источник
comment
import writes.micro._ тоже не работает?   -  person Naetmul    schedule 30.07.2014


Ответы (1)


причина, по которой неявный класс case не работает, заключается в том, что это просто определение, а не значение. Объект варианта использования решит эту проблему, как и объект. Рассмотрим этот код:

object MainClass {


  def main(args: Array[String]) {

    TestModel.manyToJSON(Nil)
  }
}

case class TestModel(test:String)

object TestModel {

  def manyToJSON(models: List[TestModel]) = {
    import writes._
    def print(implicit x: Int) = {
      println(x)
    }

    print // print 3
  }

  object writes {
    implicit val x: Int = 3
    //implicit val x = 3 //compilation error

  }
}
person Xiaohe Dong    schedule 30.07.2014
comment
пока ваш пример работает, мне нужно было передать мое неявное значение новому объекту case, а не моему объекту TestModel, по какой причине он не работает в том же объекте? - person magegu; 30.07.2014
comment
implicit val micro = Json.writes[TestModel], нужно указать тип микро. Я думаю, что это хорошее соглашение, чтобы указать тип. :) Я снова отредактирую свой код. - person Xiaohe Dong; 30.07.2014