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。代码快照: 我无法打开 black :: 的声明,所以我不知道它是什么。
如果 black :: 是方法,则应通过以下方式调用:
... {case _.::(y).::(x) => y} //compile failed!
那么, black :: 是什么?方法或案例类?
非常感谢!
答案 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表示第二个值。
这种情况下返回序列中的第三个元素。
在此示例中,第一个和第二个元素用下划线表示,因为我们不需要这些元素,因此用_代替。
如果传递列表的大小小于预期大小,它也会引发异常,例如下面的示例将引发异常:
val third: List[Int] => Int = {case _ :: _ :: z :: _ => z}
third(List(1, 2))