Как мне сопоставить массивы совпадений в Scala?
Определение моего метода выглядит следующим образом
def processLine(tokens: Array[String]) = tokens match { // ...
Предположим, что я хочу знать, свободна ли вторая строка
case "" == tokens(1) => println("empty")
Не компилируется. Как мне это сделать?
Ответы
Ответ 1
Если вы хотите сопоставить шаблон в массиве, чтобы определить, является ли второй элемент пустой строкой, вы можете сделать следующее:
def processLine(tokens: Array[String]) = tokens match {
case Array(_, "", _*) => "second is empty"
case _ => "default"
}
_*
связывается с любым количеством элементов, включая none. Это похоже на следующее совпадение в списках, которое, вероятно, лучше известно:
def processLine(tokens: List[String]) = tokens match {
case _ :: "" :: _ => "second is empty"
case _ => "default"
}
Ответ 2
Совпадение шаблонов не может быть правильным выбором для вашего примера. Вы можете просто сделать:
if( tokens(1) == "" ) {
println("empty")
}
Согласование шаблонов более подходит для таких случаев, как:
for( t <- tokens ) t match {
case "" => println( "Empty" )
case s => println( "Value: " + s )
}
которые печатают что-то для каждого токена.
Изменить:, если вы хотите проверить, существует ли какой-либо токен, который является пустой строкой, вы также можете попробовать:
if( tokens.exists( _ == "" ) ) {
println("Found empty token")
}
Ответ 3
Оператор case
не работает. Это должно быть:
case _ if "" == tokens(1) => println("empty")
Ответ 4
Что особенно круто, так это то, что вы можете использовать псевдоним для материала, сопоставляемого _*
с чем-то вроде
val lines: List[String] = List("Alice Bob Carol", "Bob Carol", "Carol Diane Alice")
lines foreach { line =>
line split "\\s+" match {
case Array(userName, [email protected]_*) => { /* Process user and his friends */ }
}
}