Scala:什么是:: in {case x :: y :: _ => Y}?方法或案例类?

时间:2016-01-06 03:18:15

标签: scala

object Test1 extends App {
    val list: List[Int] => Int = {
        case x :: y :: _ => y    //what is ::? method or case class?
    }
    println(list(List(1, 2, 3)))    //result is 2.
}

我在scala IDE中设置了“语法着色”,方法的前景色我设置了Red。代码快照: enter image description here 我无法打开 black :: 的声明,所以我不知道它是什么。

如果 black :: 是方法,则应通过以下方式调用:

... {case _.::(y).::(x) => y}     //compile failed!

那么, black :: 是什么?方法或案例类?

非常感谢!

2 个答案:

答案 0 :(得分:3)

我认为这是一种描述here的方法。从历史的角度来看,如果页面消失了,这就是模糊:

  

关于列表上的模式匹配

     

如果您查看第15章中解释的可能的模式形式,   你可能会发现List(...)和::看起来都不适合其中一个   那里定义的模式种类。实际上,List(...)是一个实例   库定义的提取器模式。这些模式将被处理   在第24章中。“cons”模式x :: xs是一个特例   中缀操作模式。你已经知道,当被视为一个   表达式,中缀操作相当于方法调用。对于   模式,规则是不同的:当看作一个模式,一个中缀   p op q等操作等同于op(p,q)。也就是中缀   operator op被视为构造函数模式。尤其是缺点   像x :: xs这样的模式被视为::( x,xs)。这暗示了那里   应该是一个名为::的类,对应于模式   构造函数。确实有这样的阶级。它被命名为scala。:: and   正是构建非空列表的类。所以::存在两次   在Scala中,曾经作为scala包中的类的名称,并且再次作为   类List中的方法。方法::的作用是产生一个   类scala。::。的实例。你会发现更多关于如何的细节   List类在第22章中实现。

所以这是scala。:( a,b)

答案 1 :(得分:1)

此处将应用序列模式。

案例x :: y :: _ => y

意味着,传递的序列的第一个值映射到x,第二个值映射到y,所有其余值都应用通配符模式(_)。

最后,案例返回y表示第二个值。

另一个例子:案例x :: y :: z :: _ => z

这种情况下返回序列中的第三个元素。

另一个例子:案例_ :: _ :: z :: _ => z

在此示例中,第一个和第二个元素用下划线表示,因为我们不需要这些元素,因此用_代替。

如果传递列表的大小小于预期大小,它也会引发异常,例如下面的示例将引发异常:

val third: List[Int] => Int = {case _ :: _ :: z :: _ => z}

third(List(1, 2))