先日のエントリで、ArraySeq.unsafeWrapArrayを取り上げましたが、そもそも何が'unsafe'なの?immutableなデータ構造にラップするので、safeなのでは?と疑問に思ったところ、いつものごとくKenji Yoshida(@xuwei_k)さんに教えて頂きました。
immutableなコレクションなのに、もとのArrayの参照保持しておいて中身変えると、ArraySeqの方も変わるからunsafe、という意図です。
— Kenji Yoshida (@xuwei_k) 2019年6月2日
言い換えると、もとのArrayを変更しないと自分で保障出来て、パフォーマンス的にどうしてもコピーを避けたいときにだけ自己責任で使え、という意味でそういう命名かと pic.twitter.com/5v91rkNdco
なるほどーいくらラップしても元のArrayがmutableであることには変わりないので、そこは理解して使えよ!ってことのようです。その注意喚起の意味でのunsafeですね。
ちなみにArraySeq.unsafeArray
のscaladocにはそれなりのメソッドの危険性が書かれています。
abstract defunsafeArray: Array[_] The wrapped mutable Array that backs this ArraySeq. Any changes to this array will break the expected immutability. Its element type does not have to be equal to the element type of this ArraySeq. A primitive ArraySeq can be backed by an array of boxed values and a reference ArraySeq can be backed by an array of a supertype or subtype of the element type.
しかしどちらかというと、ArraySeq.unsafeWrapArray
のscaladocに書いて欲しいところですね。
もしどこにも書いてないならscaladoc追加するだけのpull reqチャンス(?)
— Kenji Yoshida (@xuwei_k) 2019年6月2日
というわけでアドバイスを頂いたこともあり、初めてのScala本体へのPRを書きました。
レビューは通っているので、Scala 2.13.1あたりには取り込まれるのではないでしょうか。
1行の、ドキュメント追加とはいえ、マージされると嬉しいなぁ。