我可能听起来很傻,但我是斯卡拉的新手所以请耐心等待。 我对scala中使用switch case感到困惑。根据查找列表的最后一个元素的示例
字母'h'和'k'在做什么?总之,如果有人能够解释下面的内容,我将非常感激。
def recLast[A](ls: List[A]): A = ls match {
case h :: Nil => h
case b :: rest => recLast(rest)
}
答案 0 :(得分:2)
在Scala中,List[A]
是使用单链表实现的抽象类,由类型为A
的头元素和类型为List[A]
的尾部组成。具体实现是Cons
(::
),表示哪个有头和尾,而Nil
是空列表。
recLast
中发生的情况是List[A]
使用名为模式匹配的功能进行分解。 case
表示我们尝试匹配的模式。
第一种情况:
case h :: Nil => h
表示"如果List[A]
包含头元素h
,尾部是空列表(称为Nil
),则返回头元素。
第二种情况
case b :: rest => recLast(rest)
表示"如果List[A]
包含我们绑定到b
的头元素和我们绑定到tail
的{{1}},请抓住尾巴列表并以递归方式调用rest
。
recLast
上的一种模式匹配方法是使用List[A]
类。通过使用中缀表示法调用Cons
方法的head :: tail
,它相当于:::.apply
类的具体实现:
::.apply(head, tail)
(缺点):
::
final case class ::[B](override val head: B,
private[scala] var tl: List[B]) extends List[B] {
override def tail : List[B] = tl
override def isEmpty: Boolean = false
}
:
Nil
答案 1 :(得分:0)
如果列表有一个元素,则case语句进行模式匹配(即它是:: Nil,它将匹配第一种情况,并将被分配给h,后一种情况做同样的事情,并分配其余的(尾部) )“休息”
如果在REPL中编写以下内容,也可以看到此模式匹配
scala> val h :: rest = List(1,2,3,4)
h: Int = 1
rest: List[Int] = List(2, 3, 4)