ご存知の通り(?)以下のような血みどろなマサカリが飛び交っていましたが
twitter の bijection というライブラリの名前問題
まぁその話の本体についてはおいておいて、その副産物というか、そのpull request欄のコメントにて、面白い有用な話を見つけたのでメモ。
まず簡単に Unboxed Tagged Types について説明しておくと、1年ちょっと前に発見というか発明されて、現在はScalazとshapelessで使われています。(誤解を恐れずに)一言でいうと、
「Scala2.9以前でも、Scala2.10で入った、value classと似たようなことができる」
という感じです。詳しくは以下のetorreborreさんのblogとか読んでください。
- http://etorreborre.blogspot.jp/2011/11/practical-uses-for-unboxed-tagged-types.html
- https://github.com/scalaz/scalaz/blob/v7.0.0-M7/core/src/main/scala/scalaz/Tag.scala
- https://github.com/milessabin/shapeless/blob/shapeless-1.2.3/core/src/main/scala/shapeless/typeoperators.scala#L60-L68
で、Unboxed Tagged Types の落とし穴とは、その bijection の pull requestのコメント欄で、Scalazのコミッターでもあり、最近typesafeに入った retronymさんが言ってました。
https://github.com/twitter/bijection/pull/44#issuecomment-12089760
以下のようなことが起きます
まぁ偶然発見されたものだし、こんなことがあってもしょうがないですね。詳細な説明は面倒なので省きますが、簡単にいうと
- JVMレベルで、プリミティブ型のArrayと参照型のArrayは互換性がない
というのと
- Scalaの可変長引数の内部実装
により起こる現象だとおもわれます。
追記:
これ、2.10.0だと起きない。2.9.2だと起きる。 URL
2013-01-10 23:12:08 via web
自分でもやってみたらそうなってました。2.9で発生する内部的な原因はたしかに上記に書いた2点ですが、2.10.0で発生しないのは
- バグがなおったのか?
- たまたま内部実装が変わって、例外が起きなくなったのか?
どっちなんでしょうね・・・。誰か詳しいこと知ってたら教えて下さい