0

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

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

我不明白(2)是如何工作的。你会如何去糖这个 -for声明?

4

1 回答 1

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)
于 2014-03-26T13:13:26.060 回答