繁体   English   中英

Scala:什么是 :: 在 { case x:: y:: _ => y} 中? 方法还是案例类?

[英]Scala: What is :: in { case x :: y :: _ => y}? Method or case class?

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 中设置了“语法着色”,方法的前景颜色我设置为红色。 代码截图: 在此处输入图像描述 而且我无法打开black::的声明,所以我不知道它是什么。

如果black::是方法,应该这样调用:

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

那么,什么是黑色:: 方法还是案例类?

非常感谢!

我认为这是此处描述的方法。 为了历史的缘故,万一该页面消失了,这里是简介:

关于列表上的模式匹配

如果您查看第 15 章中解释的可能的模式形式,您可能会发现 List(...) 和 :: 看起来都不适合其中定义的一种模式。 事实上,List(...) 是库定义的提取器模式的一个实例。 此类模式将在第 24 章中处理。“cons”模式 x:: xs 是中缀操作模式的特例。 您已经知道,当被视为表达式时,中缀操作等同于方法调用。 对于模式,规则是不同的:当被视为模式时,中缀运算(例如 p op q)等同于 op(p, q)。 也就是说,中缀运算符 op 被视为构造函数模式。 特别是,像 x:: xs 这样的 cons 模式被视为 ::(x, xs)。 这暗示应该有一个名为 :: 的类对应于模式构造函数。 确实有这样的类。 它被命名为 scala.:: 并且正是构建非空列表的类。 So:: 在 Scala 中存在两次,一次作为 scala 包中的类名,另一次作为类 List 中的方法。 method:: 的作用是生成类 scala.:: 的一个实例。 您将在第 22 章中找到有关如何实现 List 类的更多详细信息。

所以它是 scala.::(a,b)

这里应用了序列模式。

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

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

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

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

本例返回序列中的第三个元素。

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

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

如果传递的列表大小小于预期,它也会抛出异常,例如下面抛出异常:

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

third(List(1, 2))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM