Один из распространенных приемов состоит в том, чтобы заключить два значения (pc
и level
) в кортеж, давая вам одну сущность, с которой вы можете сопоставить шаблон:
(pc,level) match {
case (a,b) if condition => ...
case _ => ...
}
Проверка pc.isEmpty
сразу после создания пустого pc
предполагает, что вы обрезали код для stackoverflow, поэтому этот подход может вам здесь не помочь. Но я все равно попробую:
def updateProgrammcounter(element: Name) {
val level = findSecurityLevelOfNameInSymboltable(element.toString.trim)
var pc = new HashSet[String]
println("LEVEL: " + level)
(pc, level) match {
case (pc, level) if pc.isEmpty && level != "N" => pc += level
case (pc, "L") if pc.contains("H") => errorReject()
case (pc, "L") if pc.contains("L") => println("okay")
case (pc, "H") if pc.contains("H") => println("okay")
case (pc, "H") if pc.contains("L") => pc += level
case (_, "N") => println("We have a not valid operation!")
case _ => println("Something went terribly wrong!")
}
}
Это, очевидно, отсутствие, поскольку половина этих условий невозможна, но является буквальным переводом кода, который вы изначально предоставили. Я также недоволен побочными эффектами и мутациями, но не хотел слишком сильно меняться за один присест!
Если вы сможете добавить обратно в удаленный код или дать лучшее представление о том, чего вы пытаетесь достичь, я с радостью обновлю свой ответ:)
ОБНОВЛЕНИЕ По подсказке Даниила, вот следующий шаг; перестановка и оптимизация корпусов:
(pc, level) match {
case (_, "N") => println("We have a not valid operation!")
case (pc, level) if pc.isEmpty => pc += level
case (pc, level) if pc.contains(level) => println("okay")
case (pc, "L") if pc.contains("H") => errorReject()
case (pc, "H") if pc.contains("L") => pc += level
case _ => println("Something went terribly wrong!")
}