我正在从外部数据存储解析一系列XML响应.在此期间,我必须测试是否存在子节点,并且 - 如果存在 - 测试其值.为此,我有以下代码:
...
val properties = for {
val row <- root \\ "ResultDescription"
val cond:Boolean = checkDetectionNode(row) match {
case Some(nodeseq) => {
val txt = nodeseq.text.toLowerCase
if (txt contains "non-detect")
false
else
true
}
case None => true
}
if (cond)
val name = (row \ "CharacteristicName").text
if (charNameList.exists(s => s == name) == false)
} yield {
getObservedProperty(name) match {
case Some(property) => {
charNameList = name :: charNameList
property
}
}
}
...
Run Code Online (Sandbox Code Playgroud)
checkDetectionNode定义如下:
private def checkDetectionNode(row: scala.xml.NodeSeq) : Option[scala.xml.NodeSeq] = {
if ((row \ "ResultDetectionConditionText") != null)
Some[scala.xml.NodeSeq]((row \ "ResultDetectionConditionText"))
else
None
}
Run Code Online (Sandbox Code Playgroud)
上面的代码导致行上的"非法启动简单表达"的未指定错误val name...
.说实话,我不是Scala程序员,甚至不是函数式程序员(总是更偏向于OO /命令式).我已经使用Scala几天了,并且基于Java和lambda运算符基于我所知道的大部分内容.不幸的是,我没有时间坐下来像我希望的那样真正学习Scala.截止日期,愚弄我们所有人.
我希望有人可以看看并告诉我是否有什么我做错了(因为我确信有).我试图限制显示的代码,我希望,与问题相关.但是,如果需要任何其他代码,请告诉我.
谢谢
小智 1
xml 在这里是一个干扰。问题是最后的 if (cond) 并没有起到保护作用,它只是看起来应该起到保护作用,编译器认为这是新的 if 'then' 部分的开始。
\n\n在以下示例中:
\n\nval l = List(1,2,3,4,5)\n\nval r = for {\n i <- l \n if (i > 2)\n x <- Some(i * 2)\n } yield x\n
Run Code Online (Sandbox Code Playgroud)\n\n你会得到 List(6,8,10) 正如你所期望的。
\n\n使用
\n\nval r = for {\n val i <- l if (i > 2)\n val x <- Some(i * 2)\n } yield x\n
Run Code Online (Sandbox Code Playgroud)\n\n应该给你一个弃用警告,并且
\n\nval r = for {\n val i <- l \n if (i > 2)\n val x <- Some(i * 2)\n } yield x\n
Run Code Online (Sandbox Code Playgroud)\n\n得到
\n\nerror: illegal start of simple expression\n val x <- Some(i * 2)\n
Run Code Online (Sandbox Code Playgroud)\n\n只需删除生成器前面的 val (Pattern1 \xe2\x80\x98<-\xe2\x80\x99 Expr [Guard]),即可恢复正常服务。我发现,在 for 循环中没有 vals 时,它的流动性也会更好一些。
\n