动态分解和组装元组

时间:2014-08-26 19:21:56

标签: scala

我有一些代码涉及验证用户生成的Map中是否存在键/值,这导致了许多级别的嵌套代码。 TypeSafe的Slick框架有一个非常干净的方法将数据库结果加载到元组列表中:

Q.queryNA[Tuple3[Int,String,Double]]("SELECT post_id,post_title,post_score FROM posts").list

我认为这种语法可以是一种简洁的方法来验证和模式匹配多个字段,例如:

parseMap[Tuple3[Int,String,Double]](map_in,"post_id","post_title","post_score") match {
    ((post_id,post_title,post_score)) => //...do processing
    _ => println("one or more fields were missing or could not be parsed to datatype")
}

我一直试图解决这个问题,但我可能会在我脑海中。我的伪代码可能看起来像这样(现在假设地图将验证以保持代码简单)

def parseMap[T<:Product](map_in: Map[Any],fields: String*) = {
     val head = Tuple1(map_in(fields.head).as[classOf[T._1]])
     if(T.isInstanceOf[Tuple1[_]]) head else head ++ parseMap[T(1->arity)](map_in,fields.tail)
}

所以,显然这段代码不会接近编译。主要问题是 1. T是模板类型,而不是值,因此classOf将无法使用它。 2.解耦元组的剩余元素(及其数据类型),然后重新连接它们。

似乎这里有很多东西是不可能做到的,但是由于Slick框架做到了,所以必须有办法。我尝试读取他们的queryNA方法的github代码,但它超出了我的专业水平。

我考虑过的另一种语法,虽然与Slick语法不同,但是编写一个返回Product对象的def,并接受一个字段名称和数据类型元组列表。

List("post_id"->Int,"post_title"->String,"post_score"->Double)

虽然这仍然无法解决我必须动态组装元组的根本问题。

0 个答案:

没有答案