【发布时间】:2014-11-03 22:11:44
【问题描述】:
我试图解释 for 理解是如何工作的,因为它正在做一些与我期望它不同的事情。我看了几个答案,其中最相关的是这个Scala "<-" for comprehension 但是,我仍然感到困惑。
以下代码按预期工作。它打印两个不同正则表达式匹配的值不相等的行(一个用于会话 cookie 中的值,另一个用于 GET args 中的值,只是为了提供上下文):
file.getLines().foreach { line =>
val whidSession: String = rWhidSession.findAllMatchIn(line) flatMap {m => m.group(1)} mkString ""
val whidArg: String = rWhidArg.findAllMatchIn(line) flatMap {m => m.group(1)} mkString ""
if(whidSession != whidArg) println(line)
}
以下是有问题的代码,它对匹配字符串中的字母进行迭代,因此在两个值中有不同的字母时会多次打印该行:
/**
* This would compare letters, regardless of the use of mkString.. even without the flatMap step.
*/
val whidTuples = for {
line <- file.getLines().toList
whidSession <- rWhidSession.findAllMatchIn(line) flatMap {m => m.group(1) mkString ""}
whidArg <- rWhidEOL.findAllMatchIn(line) flatMap {m => m.group(1) mkString ""} if whidArg != whidSession
} yield line
【问题讨论】:
-
不确定这是否相关,但您的第二个版本出现(无论如何一目了然)与第一个版本有所不同:在
whidSession <- ...行中,mkString ""部分位于{} 而不是第一种情况下的外部。错误? -
在第一个 sn-p 中,您使用正则表达式
rWhidArg,但在第二个中使用rWhidEOL。也许您的第二个正则表达式在每个符号中都匹配?