我的方法定义如下
def processLine(tokens: Array[String]) = tokens match { // ...
假设我想知道第二个字符串是否为空
case "" == tokens(1) => println("empty")
不编译。我该怎么做呢?
Answers:
如果要在阵列上进行模式匹配以确定第二个元素是否为空字符串,则可以执行以下操作:
def processLine(tokens: Array[String]) = tokens match {
case Array(_, "", _*) => "second is empty"
case _ => "default"
}
将_*
结合到任何数量的元件,包括无。这类似于列表上的以下匹配,这可能是众所周知的:
def processLine(tokens: List[String]) = tokens match {
case _ :: "" :: _ => "second is empty"
case _ => "default"
}
tail @ _*
_*
是匿名变量吗?如果要在case块内打印此尾巴的值,该怎么办?如果我这样做,case a
则可以a
在case块内使用,但是如果执行case _
此操作,则该变量在case块内将不可用。你能解释更多吗?我尝试使用Array(a,b,c),但它将匹配大小为3的数组,而不是大小为n的数组。
模式匹配可能不是您的示例的正确选择。您可以简单地执行以下操作:
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")
}
println
就是使您的代码具有过程性的原因。您明显的困惑源于这样的事实:if
在Scala中,块是表达式而不是语句(即,它们返回值,因此功能完善)。使用if
表达式而不是模式匹配并没有固有的程序性。
case
声明不能那样工作。应该是:
case _ if "" == tokens(1) => println("empty")
case
关键字后添加一些复杂的类似于数组的表达式,例如(_, "", _). Saying
case _`很无聊,但我认为这是您可以做的所有事情。也可以取消比赛并说return tokens(1) == ""
:-)。
tokens match {}
)。