scala类库中的api陷阱(1): LinkedList.append

scala.collection.mutable.LinkedList 可变集合的 append 方法有个细节需要注意:

// 当list为空时
scala> val list = LinkedList[String]()

scala> val list2 = LinkedList[String]("ele")

scala> list.append(list2)
res6: scala.collection.mutable.LinkedList[String] = LinkedList(ele)

scala> list
res7: scala.collection.mutable.LinkedList[String] = LinkedList()

scala> list.size
res8: Int = 0

看到 list 本身并没有改变,仍为空,它的实现是判断自身为空时append方法直接返回要附加的对象,所以得这样用。

scala> val r = list.append(list2)
r: scala.collection.mutable.LinkedList[String] = LinkedList(ele)

scala> r(0)
res9: String = ele

当它不为空时,才会改变自身:

scala> val list = LinkedList[String]("1")

scala> list.append(list2)

scala> list.size
res11: Int = 2

它的文档里有讲到这点,但仍觉得很不合理,一是不符合大众的直觉,二是也并非所有的可变集合在为空时 append 操作也这样,比如ListBuffer里的append方法,在自身为空时仍会改变自身:

scala> val buf = ListBuffer[String]()
buf: scala.collection.mutable.ListBuffer[String] = ListBuffer()

scala> buf.append("A")

scala> buf
res4: scala.collection.mutable.ListBuffer[String] = ListBuffer(A)

scala> buf(0)
res5: String = A

scala类库中的api陷阱(1): LinkedList.append》上有4条评论

  1. hary

    scala.collection.mutable.LinkedList 已经被废弃了啊

    scala> val list = LinkedList[String]()
    :8: warning: object LinkedList in package mutable is deprecated: Low-level linked lists are deprecated.
    val list = LinkedList[String]()

    回复
    1. hongjiang 文章作者

      这是一年前写的,当时版本还是2.10,2.11里 deprecated 的

      回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注