我试图理解下面的代码,但却陷入case y :: ys
。这是如何定义的?我没有看到y
和ys
的任何声明......它们来自哪里?
我理解case
匹配尝试在对象上做等于,但case y :: ys
似乎是一个操作。这里发生了什么?
def f(xs: List[Int], g: (Int, Int) => Boolean) = {
def h(x: Int, xs: List[Int]): List[Int] =
xs match {
case List() => List(x)
case y :: ys => if (!g(x, y)) x :: xs else y :: h(x, ys)
}
(xs :\ List[Int]())(h)
}
答案 0 :(得分:4)
我没有看到y和ys的任何声明,所以它们来自哪里?
您看到的是声明。
案例能够根据模式将值(此处xs
)解构为其部分,如果“匹配”(请参阅?)。
这里将列表解构为头部(名称为y
)和尾部/休息(名称为ys
)。现在可以在箭头后面的表达式中单独访问这两个部分。
答案 1 :(得分:1)
case y :: ys =>
这相当于列表的模式匹配,其中x
与列表的head
匹配,ys
与tail
匹配。在模式加工中,您可以解构输入以匹配给定的模式,在这种情况下,列表中y
为头部,ys
为尾部
答案 2 :(得分:0)
与其他答案一样,case y :: ys
与列表的head
(y)和tail
(ys)匹配。
它实际上是一种语法糖,::
是case class
,您可以检查docs和case y :: ys
等于case ::(y, ys)
。