LoginSignup
3
0

More than 5 years have passed since last update.

"エンタメコードでみんなに笑顔を"(笑)

Posted at

はじめに

やってる事は手の込んだHello World。
でも普通に書いても面白くないので演算子オーバーロードと拡張メソッドを濫用してみた。
もちろんJVMで動くし、JavaScriptにコンパイルしてもちゃんと動作する。

Scalaの中置記法と記号メソッドを使って

ささやき > えいしょう > いのり > ねんじろ !

とかやってみた事がある人向け…なのか?

この記事に書いてあるような書き方は、もしかしたら何かの役に立つかもしれないし、立たないかもしれない。
でもそれ以上に、このタイトルを見てクリックした時の「ときめき」みたいなものを(以下省略)

至高の演算子オーバーロード・インヴォーク

ShowMustGoOn.kt
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型に含まれるため (笑)(笑)(笑)(笑) とか書けてしまう(笑)

ただし「できる」と「するべき」は違う。
どちらかといえば、こういう書き方は「すべきでない」だろう。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0