package object の定義は外部からでも(implicit も含めて)使えるらしい

環境

scala 2.9.1

ものすごい勢いで REPL を立ちあげた

http://d.hatena.ne.jp/hideshi_o/20111207/1323275884
ここを見てびっくりギョウテンして慌てて確かめてみたんですが、、、

scala> import scala.sys.process._

scala> "ls" run

アイエエエ!ナンデ!?run ナンデ!?


この謎に満ちた現象を解決すべき物凄い勢いで調べてみると


https://github.com/scala/scala/blob/master/src/library/scala/sys/process/Process.scala#L230
ここで implicit def を定義した trait を用意して

https://github.com/scala/scala/blob/master/src/library/scala/sys/process/package.scala#L205
package object の形にしてるっぽい。


な、なるほど、追ってみれば普通に分かりますが、package object の定義を import で取れるというのを知らなかったのでびっくりしました。


「package object だって object だよね。」と言われればまぁおっしゃるとおりなんですが、なんかその発想はなかったわ。。。という感ですた( ;´。 `;)


つまり、↑は

scala> import scala.sys.process.stringToProcess

scala> "ls" run

って感じっぽいですね。


これ今まで知らなくてすごい損してました。もちろん implicit def を定義しまくると(しかも package object !!)物凄く可読性下がるとは思うので最低限にしたいですが、いざという時は使いたいなーという気持ちが抑えれないデス!! import hoge._ には魔法が込められている!

適当に試したサンプルコードをペタペタ