Ale*_*son 3 sql database sqlite scala tuples
Scala的新手,但是在C++方面经验丰富我试图在sqlite4java库之上实现(可能被误导)一个小型库,允许我从查询行(列类型各自与之兼容的行)中自动填充abritrary类型的元组相应的元组元素类型).
在C++中,我通常使用boost :: tuples和编译时模板递归来实现它(使用模板特化终止,如下所示).Boost元组的实现与Haskell HLists非常相似.模式将是(假设为简单起见,查询作为字符串向量返回):
template<typename T1, typename T2>
void populateTuple( boost::tuples::cons<T1, T2>& tupleRec, int index, const std::vector<std::string>& vals )
{
tupleRec.head = boost::lexical_cast<T1>( vals[index] );
populateTuple( tupleRec.tail, index+1, vals );
}
template<typename T>
void populateTuple( boost::tuples::cons<T, boost::tuples::null_type>& tupleRec, int index, const std::vector<std::string>& vals )
{
tupleRec.head = boost::lexical_cast<T>( vals[index] );
}
Run Code Online (Sandbox Code Playgroud)
(道歉 - 我没有通过编译器运行上面的内容,但我希望它显示我的意思)
我希望能够用Scala做类似的事情.我可以通过Product trait递归一般的Tuple类型 - 并使用模式匹配(对于我支持的少量列类型)在运行时获取每个元素的类型.但是我还没有找到通过产品特性分配元组元素的方法.说实话,我不相信这是一种特别好的或惯用的方式来做我需要的.
但是像这样:
val returnedFromQuery = List[String]( "Hello", "4", "6.0" )
val rowAsTuples = interpretListAsTuple[(String, Int, Float)]( returnedFromQuery )
Run Code Online (Sandbox Code Playgroud)
其中rowAsTuples具有类型(String,Int,Float).再次请原谅任何语法错误.
有人有什么想法?还是另类建议?事先 - 我对任何更高级别的SQL查询库都不感兴趣.我对sqlite4java很满意,但想用一个简单的更抽象的界面来包装它.
我认为你应该尝试使用模式匹配而不是解释.首先,我们需要一些能够使用unapply以下方法从字符串中提取类型的东西:
object Stringy {
def unapply(s: String) = Some(s)
}
object Inty {
def unapply(s: String) = {
try { Some(s.toInt) }
catch { case nfe: NumberFormatException => None }
}
}
object Floaty {
def unapply(s: String) = {
try { Some(s.toFloat) }
catch { case nfe: NumberFormatException => None }
}
}
Run Code Online (Sandbox Code Playgroud)
现在我们可以在模式匹配中使用它们:
scala> List("Hello","4","6.0") match {
case Stringy(s) :: Inty(i) :: Floaty(f) :: Nil => Some((s,i,f))
case _ => None
}
res3: Option[(String, Int, Float)] = Some((Hello,4,6.0))
Run Code Online (Sandbox Code Playgroud)
请注意,如果你这样做,你(1)如果你不想,你不必返回元组; (2)可以立即访问所有已解析的变量; (3)内置自动错误检查(带选项).
| 归档时间: |
|
| 查看次数: |
851 次 |
| 最近记录: |