在scala中使用match .. case

时间:2017-04-02 05:57:26

标签: scala

我可能听起来很傻,但我是斯卡拉的新手所以请耐心等待。 我对scala中使用switch case感到困惑。根据查找列表的最后一个元素的示例

字母'h'和'k'在做什么?总之,如果有人能够解释下面的内容,我将非常感激。

def recLast[A](ls: List[A]): A = ls match {
    case h :: Nil => h
    case b :: rest => recLast(rest)
}

2 个答案:

答案 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)