Predef.identityの代わりにPredef.conformsを使う

かなりどうでもいい細かいパフォーマンスに関する話です。


Haskellでいうところのid関数として、ScalaにはPredefにidentityという名前のメソッドが定義されています。

https://github.com/scala/scala/blob/v2.10.3/src/library/scala/Predef.scala#L132

で、identityの代わりに、conformsというものが使えるというだけの話です。

https://github.com/scala/scala/blob/v2.10.3/src/library/scala/Predef.scala#L437

conforms自体は、確かにidentityと同じものとして使えますが、本来の目的は別のものです。conformsの説明はyuroyoroさんのこれ

Scalaで<:<とか=:=を使ったgeneralized type constraintsがスゴすぎて感動した話

とか読んで下さい。

さて、なぜconformsをidentityの代わりに使うかというと、conformsは内部でAny => Any型に相当するオブジェクトをキャストして使いまわしているので、毎回Function1型の新しいオブジェクトが生成されない、という利点があります。ただそれだけです。
自分が思いついたのではなく、とある人がidentityの代わりにconforms使ってるの見て気が付きました。
しかし「identityの代わりにconforms使ったほうが、オブジェクトの生成コスト減る」という理由がわからない人にとっては、いきなりconformsがでてきてもわかりにくいと思うし、そもそもこういった細かいオブジェクト生成は問題になることはほとんどないので、「みんなidentityの代わりにconforms使おう!」とは言いづらいですね。


以上、どうでもいい話でした。



追記:
うっ、2.11で直接conforms呼ぶのは非推奨になるみたい・・・
https://issues.scala-lang.org/browse/SI-7788
https://github.com/scala/scala/pull/3555