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._ には魔法が込められている!