Scala之::的研究

推荐:博主历时三年倾注大量心血创作的《大数据平台架构与原型实现:数据中台建设实战》一书已由知名IT图书品牌电子工业出版社博文视点出版发行,真诚推荐给每一位读者!点击《重磅推荐:建大数据平台太难了!给我发个工程原型吧!》了解图书详情,扫码进入京东手机购书页面!

在这里插入图片描述

一个很细节的问题,简单总结一下。::在Scala里有两种含义,一种是List集合的一个方法,用于把一个元素添加到集合的前面;另一种表示一个非空的List集合,往往应用于模式匹配中。本文原文出处: http://blog.csdn.net/bluishglc/article/details/55668192 转载请注明出处。

第一种用法: List的一个方法,用于在头部添加新元素

示例代码

1 :: List(2, 3) = List(2, 3).::(1) = List(1, 2, 3)

这种写法在Scala里极为常见,但是会让初学者感到困惑:既然::是List的方法,为什么List实例出现在了方法右侧,而方法参数出现在了左侧。原因是:在Scala里所有以“:”结尾的运算符是右关联的,其他的运算符都是左关联的!

参考:

这里写图片描述

第二种用法:表示一个非空的List,常见于模式匹配

示例代码

def sum(list: List[Int]): Int = list match {
    case Nil => 1
    case n :: rest => n + sum(rest)
}

类似上面的写法在面向集合的模式匹配中很常见:对于n :: rest这段代码的工作方式的详细解释是: 它等同于::(n, rest),此处的::实际上是一个case class,在Scala API文档中,关于这个类地址是:http://www.scala-lang.org/api/current/scala/collection/immutable/ c o l o n colon colon.html。 我们经常使用的List是一个抽象的sealed类,它只有两个实现类:Nil::, 而既然它是一个case calss,那么自动实现了unaplly方法的::自然可以顺其自然地参与到模式匹配中,进而就是我们看到的写法n :: rest,它会匹配一个非空集合,结合的第一个元素被提取并赋给变量n, 剩余集合被提取并赋予变量rest.

参考:

扫描二维码关注公众号,回复: 11320527 查看本文章

这里写图片描述

猜你喜欢

转载自blog.csdn.net/bluishglc/article/details/55668192