scala.collection.immutable.List is not immutable URL
2012-03-11 17:06:13 via web
@xuwei_k これは。varにする必然性はあるんでしょうかね。
2012-03-11 18:01:58 via web to @xuwei_k
:: の tail が var なのは ListBuffer のためだよね。どっちかというと可視性の問題か。
@gakuzzzz private[scala] これが甘いということですかね。
2012-03-11 18:12:14 via web to @gakuzzzz
@gakuzzzz 規約は確認していませんが、仰るとおり基本的には大丈夫ですね。自由だとすればscala.collectionにしたとしても同様の問題が起きてしまいますし。。
2012-03-11 18:22:27 via web to @gakuzzzz
@jinjor ですねー
まぁ、苦労してわざと落とし穴にはまる人はいないから問題ではないかw
2012-03-11 18:32:41 via web
まぁ上記の会話のとおり、普通とくに問題ないはずです。で、ちょっと調べてみた結果
まず、githubのscala/scalaからたどれる、一番古いとおもわれる v1.0.0-b5 というtag
https://github.com/scala/scala/blob/v1.0.0-b5/sources/scala/$colon$colon.scala#L18
- immutableになってる
- serializeのためのwriteObjectとかreadObjectなどは存在しない
- ListBufferはない
つぎに v1.4.0+3
- :: の構造は変わってない https://github.com/scala/scala/blob/v1.4.0+3/sources/scala/List.scala#L914
- ListBufferある https://github.com/scala/scala/blob/v1.4.0+3/sources/scala/collection/mutable/ListBuffer.scala
v2.0.0
- :: の内部構造変わっていて、 private[scala] var tl: List[b] というのが https://github.com/scala/scala/blob/v2.0.0/src/library/scala/List.scala#L1085
- serializeの処理はなし
- ListBuffer で、 tl に代入している https://github.com/scala/scala/blob/v2.0.0/src/library/scala/collection/mutable/ListBuffer.scala#L143
さらにその間のcommitまで調べてみて、見つけた
https://github.com/scala/scala/commit/99b6474dabc8a4bcc9282f041d48fb9671c4f2b8#L13L914
private[scala] var tlにすると同時に、ListBufferから参照してる
というわけで、serializeのためではなく、なんらかの理由(パフォーマンスなのか?)でListBufferから直接アクセスして書き換えたいためにprivate[scala] var なフィールを内部に持つようになったんじゃないかなーという勝手な予想。2005-12-21 という、かなり昔からこうなっていたようですね。あと、private[collection] ではなく private[scala] なのは、2.7.7までListはscala packageの直下に置かれていた名残だと思う
追記:
コップ本書いてありましたね、すいません・・・(・ω・`)
http://www.artima.com/pins1ed/implementing-lists.html#22.2