如何"去糖"这个Scala声明?

时间:2014-03-26 13:09:39

标签: scala for-comprehension json4s

使用json4s的Scala中的LINQ样式查询如下所示:

val jvalue = parse(text) // (1)
val jobject = for(JObject(o) <- jvalue) yield o // (2)

我不明白(2)究竟是如何工作的。你会如何解除这个for声明?

1 个答案:

答案 0 :(得分:2)

表格的理解

for(v <- generator) yield expr

被翻译成

generator.map(v => expr)

如果左侧有模式匹配,则过滤掉与模式不匹配的任何输入值。这意味着创建了包含匹配的部分函数,​​并且可以使用isDefinedAt测试每个输入参数,例如

val f: PartialFunction[JValue, JObject] = { case o@JObject(_) => o }
f.isDefinedAt(JObject(List[JField]()))   //true
f.isDefinedAt(JNull)                     //false

这意味着您的示例将被翻译为:

PartialFunction[JValue, List[JField]] mfun = { case JObject(o) -> o }
var jobject = jvalue.filter(mfun.isDefinedAt(_)).map(mfun)