Sou*_*nta 12 scala list pattern-matching
关于Scala列表中的模式匹配,我有点困惑.
例如.
val simplelist: List[Char] = List('a', 'b', 'c', 'd')
//> simplelist : List[Char] = List(a, b, c, d)
def simple_fun(list: List[Char]) = list match {
case (x:Char) :: (y:List[Char]) => println(x)
case _ => Nil
}
//> simple_fun: (list: List[Char])Any
simple_fun(simplelist)
//> a
//| res0: Any = ()
Run Code Online (Sandbox Code Playgroud)
目前只打印一行输出.它是否应该在列表的每个元素上运行/模式匹配?
编辑:我修复了编译错误并复制了REPL的输出.
Rus*_*ell 25
除非你simple_fun以某种方式反复呼叫,否则你所拥有的将与第一个元素相匹配,仅此而已.为了使它与整个列表匹配,您可以simple_fun递归调用自身,如下所示:
val simplelist: List[Char] = List('a', 'b', 'c', 'd')
def simple_fun(list: List[Char]): List[Nothing] = list match {
case x :: xs => {
println(x)
simple_fun(xs)
}
case _ => Nil
}
Run Code Online (Sandbox Code Playgroud)
注意我还省略了一些类型,因为Scala编译器可以推断它们,使您的代码更简洁,更易读.
作为一个小小的注意事项,println在函数内部反复调用并不是特别有用 - 因为它只是副作用.更惯用的方法是让函数构造一个描述列表的字符串,然后通过一次调用输出println- 所以副作用保存在一个明确定义的位置.这样的事情将是一种方法:
def simple_fun(list: List[Char]):String = list match {
case x :: xs => x.toString + simple_fun(xs)
case Nil => ""
}
println(simple_fun(simple_list))
Run Code Online (Sandbox Code Playgroud)
我还想提一下,列表的情况不仅可以划分头和尾,还可以划分任意 N 个列表元素:
def anyFunction(list: List[Int]): Unit =
list match {
// ...methods that have already been shown
case first :: second :: Nil => println(s"List has only 2 elements: $first and $second")
case first :: second :: tail => println(s"First: $first \nSecond: $second \nTail: $tail")
}
Run Code Online (Sandbox Code Playgroud)
希望它对某人有用。