はじめに
やってる事は手の込んだHello World。
でも普通に書いても面白くないので演算子オーバーロードと拡張メソッドを濫用してみた。
もちろんJVMで動くし、JavaScriptにコンパイルしてもちゃんと動作する。
Scalaの中置記法と記号メソッドを使って
ささやき > えいしょう > いのり > ねんじろ !
とかやってみた事がある人向け…なのか?
この記事に書いてあるような書き方は、もしかしたら何かの役に立つかもしれないし、立たないかもしれない。
でもそれ以上に、このタイトルを見てクリックした時の「ときめき」みたいなものを(以下省略)
至高の演算子オーバーロード・インヴォーク
package smile.world
fun main(args: Array<String>) {
"Smile World"(笑) // == println("Smile World")
}
internal object 笑 {
fun consume(x :Any?) = println(x)
}
internal operator fun Any.invoke(em :笑) = em.consume(this)
解説
最後の行でAny型の拡張メソッドとして、invokeオペレータを定義している。
invokeオペレータはレシーバーオブジェクトそのものがメソッドであるかのように呼び出せる代物。
operatorキーワードをつけずに書くと foo.invoke(bar) になるところを foo(bar) と書けるようになる。
仮引数になんでも渡せてしまうのは具合がよくないので、直前で定義している 笑objectに制限し、ついでに処理もそちらに委譲してみた。
もちろん、objectの名称が笑である必要は全然ない。爆とか確信とかでも構わない。
interfaceを定義してロガーやストリームに吐き出させるようなバリエーションを持たせるのも面白いかもしれない。
ちなみに笑object自身もAny型に含まれるため (笑)(笑)(笑)(笑) とか書けてしまう(笑)
ただし「できる」と「するべき」は違う。
どちらかといえば、こういう書き方は「すべきでない」だろう。