Я пытаюсь рассуждать о том, как работает понимание, потому что он делает что-то отличное от того, что я ожидаю от него. Я прочитал несколько ответов, наиболее актуальным из которых является этот Scala "<-" for comprehension Однако я все еще недоумеваю.Scala regex и для понимания
Следующий код работает как ожидается. Он печатает строки, где значения совпадающая с помощью двух различных регулярных выражений не равны (по одному для значения в куки сессии, а другой для значения в GET аргументах, просто чтобы дать контекст):
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 '' ' внутри {} вместо внешнего, как это было в первом случае. Ошибка? –
В первом фрагменте вы используете regex 'rWhidArg', но во втором' rWhidEOL'. Может быть, ваше второе регулярное выражение соответствует каждому символу? –