2014-04-28 32 views
0

我得到了这个类似的问题,但它并没有帮助我。 (Anorm parse float values)。

我可以诚实地说,我不明白这个问题的解决方案。
我得到这个complie时错误:无法找到参数c的隐式值:anorm.Column [Float]

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

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 
    } 
    } 
+0

您是否在您的作用域中标记为隐式的所述类型的变量? (只需在'val'前加'implicit') – bluenote10

+0

你需要这个问题的更多帮助吗? – bluenote10

回答

1

试试这个...

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)) 
} 
} 
2

也许implicits的简短评论帮助你。让我们构建一个非常简单的例子:

// 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提供隐式,因此您只需使用the code that is linked in your question即可。为了让它起作用,请在结果计算之前进行。稍后,您可能希望将其放在某个封闭范围内的val

0

某些函数可以接受我们所说的隐式参数。在某些情况下,这些参数可以从上下文中导出。如果找不到这些参数,则必须手动指定它们。如果你希望一个参数被用作一个隐含的一个,它必须声明隐含的,比如这样:

implicit val myVal = ... 

它可以在当前块或在一个封闭的一个(在类体内进行,例如甚至有时在进口)

您得到的错误似乎与此功能有关。您正在使用需要anorm.Column类型的参数的函数[Float]。该参数被定义为隐式的,以便可以使用隐式值并且您的代码可能更简洁。不幸的是,你的代码似乎没有这样的隐含价值,所以它失败了。

+0

'隐式val查询'和'隐式val结果'但是同样的错误发生 –

+0

@LOL:不需要'隐式val nameDoesNotPlayARole:anorm.Column [Float] = ...' - 现在把它放在行前你的结果计算。 – bluenote10

相关问题