Scala学习之旅-我的Seq是什么?

本文概述

先来看看我们在Scala中创建Seq的完全代码

package ddu.scala.articles

// 解剖 Seq
object DeepInSeq {
  def main(args: Array[String]): Unit = {

    val scalaCollectionSeq = Seq(1, 2, 3)
    scalaCollectionSeq.foreach(println) // 123
    println(scalaCollectionSeq.getClass) // class scala.collection.immutable.$colon$colon
  }
}

初学者应该有这样的疑问:

  • 代码没有任何的importSeq 是从哪里来的,为啥我能引用它?
  • class scala.collection.immutable.$colon$colon 是个啥?

本文跟大家一起解剖一下上述代码,看看到底Scala背后又干了些什么, 让新程序员和老程序员都如此迷惑。

下面先先引入本文要介绍的Scala的两个features:

Scala Features

  • Automatic Imports Identifiers in the scala package and the scala.Predef object are always in scope by default. Some of these identifiers are type aliases provided as shortcuts to commonly used classes. For example, List is an alias for scala.collection.immutable.List. Other aliases refer to classes provided by the underlying platform. For example, on the JVM, String is an alias for java.lang.String.
  • package objects Scala 2 provides package objects as a convenient container shared across an entire package.

在 package object scala中, 我们终于找到了Seq的定义type Seq[+A] = scala.collection.Seq[A]。 我们在代码中如果没有显式import,默认用到的就是它。

这样第一个问题问题就解决了,Scala为我们提供了默认的可见性。 下面我们再深入下去一点点,看看这个返回的东西又是个什么。

深入解剖

知道了我们用得是哪个Seq之后,我们就可以顺着往下找val scalaCollectionSeq = Seq(1, 2, 3) 最终实例化出来的是哪个对象。

先弄清围绕scala.collection.Seq[A]的class关系, 类图如下:

有了静态类图, 再看一下调用时序就更加清楚了, 先debug再画图

Debugging

至此,我们应该算弄明白了这个最后返回的 scala.collection.immutable.$colon$colon, 就是定义在 scala.collection.immutable.List 中的 ::

本文总结

Scala中的collection 真的好复杂,不仅有默认的可见性,还分为mutable和immutable,还创造了太多的符号 : :: ++=  我想Scala本是想让大家用起来方便优雅方便,奈何程序员们偏偏要去解剖内部实现,反而自扰了,学习曲线非常陡峭。 当然,待一切都弄明白之后,就会豁然开朗,又会赞美它的好了!

  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值