Не удалось найти неявное значение параметра c: anorm.Column[Float]

У меня есть этот аналогичный вопрос, но он мне не помогает. (Значения с плавающей запятой для синтаксического анализа).

И я могу честно сказать, что не понял решения этого вопроса.
Я получаю эту ошибку времени выполнения:

could not find implicit value for parameter c: anorm.Column[Float]

at

def getInformation(id: Long): List[(Float, Float, Float)] = {
    DB.withConnection { implicit con =>
      val query = SQL("select principal,interest,value from myTable where userId={id} and status=true").on("id"->id)
      val result = query().map { row =>
        Tuple3(row[Float]("principal"), row[Float]("inetrest"), row[Float]("value"))
       //      ^
      }.toList
      return result
    }
  }

person Govind Singh    schedule 28.04.2014    source источник
comment
У вас есть переменная указанного типа в вашей области, которая помечена как неявная? (просто добавьте префикс val к implicit)   -  person bluenote10    schedule 28.04.2014
comment
вам нужна дополнительная помощь с этим вопросом?   -  person bluenote10    schedule 29.04.2014


Ответы (4)


попробуй это...

def getInformation(id: Long): List[(Float, Float, Float)] = {
    DB.withConnection { implicit con =>
      val query = SQL("select principal,interest,value from myTable where userId={id} and status=true").on("id"->id)
      val result = query().map { row =>
        Tuple3(row[Float]("principal").asInstanceOf[Float], row[Float]("inetrest").asInstanceOf[Float], row[Float]("value").asInstanceOf[Float])
      }.toList
      return result
    }
  }

implicit def rowToFloat: Column[Float] = Column.nonNull { (value, meta) =>
val MetaDataItem(qualified, nullable, clazz) = meta
value match {
  case d: Float => Right(d)
  case _ => Left(TypeDoesNotMatch("Cannot convert " + value + ":" + value.asInstanceOf[AnyRef].getClass + " to Float for column " + qualified))
}
}
person Gabber    schedule 17.05.2014

Возможно, вам поможет краткий обзор имплицитов. Давайте построим очень простой пример:

// some class which will be used as implicit (can be anything)
case class SomeImplicitInformation(maybe: Int, with: Int, data: Int)

// lets assume we have a function that requires an implicit
def functionRequiringImplicit(regularParameters: Int)(implicit imp: SomeImplicitInformation) {
  // ...
}

// now if you try to call the function without having an implicit in scope
// you would have to pass it explicitly as second parameter list:
functionRequiringImplicit(0)(SomeImplicitInformation(0,0,0))

// instead you can declare an implicit somewhere in your scope:
implicit val imp = SomeImplicitInformation(0,0,0)

// and now you can call:
functionRequiringImplicit(0)

Ошибка, которую вы получаете, просто говорит о том, что anorm.Column[Float] не входит в неявную область видимости. Вы можете решить эту проблему, добавив ее неявно в свою область видимости или передав ее явно.

Более подробные инструкции для вас: поскольку объект-компаньон Column предоставляет только неявное значение для rowToDouble, вам просто нужно использовать код, связанный с вашим вопросом. . Чтобы заставить его работать, поместите его перед вычислением результата. Позже вы, возможно, захотите поместить его в val в какой-нибудь объемлющей области.

person bluenote10    schedule 28.04.2014

Некоторые функции могут принимать то, что мы называем неявными параметрами. Такие параметры могут при определенных условиях быть получены из контекста. Если эти параметры не могут быть найдены, то необходимо указать их вручную. Если вы ожидаете, что параметр будет использоваться как неявный, он должен быть объявлен неявным, например, таким образом:

implicit val myVal = ...

Это можно сделать как в текущем блоке, так и во включающем (например, в теле класса, а иногда даже в импортах)

Ошибка, которую вы получаете, похоже, связана с этой функцией. Вы используете функцию, которой нужен параметр типа anorm.Column[Float]. Аргумент определяется как неявный, поэтому можно использовать неявное значение, и ваш код может быть более кратким. К сожалению, у вас, похоже, нет такого неявного значения в вашем коде, поэтому он терпит неудачу.

person Agemen    schedule 28.04.2014
comment
implicit val queryи implicit val result, но возникает та же ошибка - person Govind Singh; 28.04.2014
comment
@LOL: нет, тебе не нужно implicit val nameDoesNotPlayARole: anorm.Column[Float] = ... - пока помести его прямо в строку перед вычислением result. - person bluenote10; 28.04.2014

Последняя версия Anorm (включенная в Play 2.3) обеспечивает больше числовых преобразований (подробнее см. ="nofollow">http://applicius-en.tumblr.com/post/87829484643/anorm-whats-new-play-2-3 и в примечаниях по переносу Google Play).

Если у вас отсутствует конвертер, вы можете добавить проблему в проект Play github.

Лучший

person cchantep    schedule 13.06.2014