JavaScript への追加が検討されているパイプライン演算子を Kotlin で作ってみた。
この記事に触発されました。
→Pipe関数の力
JavaScript のパイプライン演算子とは
c( b( a ) )
↑のようなコードを↓のように書ける。
a |> b |> c
詳しくは
→パイプライン演算子 - JavaScript | MDN
Kotlin で実装してみる
infix fun <T, R> T.pipe(unary: (T) -> R): R = unary(this)
|>
というような演算子は作れないので、pipe
で我慢する。
使用例:
fun main() {
"Hello, World!" pipe ::println // > Hello, World!
Math.PI pipe Math::round pipe ::println // > 3
}
やっぱり記号にしたい?
まあいくつかの記号は使えますけど…。
operator fun <T, R> T.plus(unary: (T) -> R): R = unary(this)
operator fun <T, R> T.minus(unary: (T) -> R): R = unary(this)
operator fun <T, R> T.times(unary: (T) -> R): R = unary(this)
operator fun <T, R> T.div(unary: (T) -> R): R = unary(this)
operator fun <T, R> T.rem(unary: (T) -> R): R = unary(this)
operator fun <T, R> T.rangeTo(unary: (T) -> R): R = unary(this)
使用例:
fun main() {
"Hello, World!" as Any? + ::println // > Hello, World!
"Hello, World!" - ::println // > Hello, World!
"Hello, World!" * ::println // > Hello, World!
"Hello, World!" / ::println // > Hello, World!
"Hello, World!" % ::println // > Hello, World!
"Hello, World!"..::println // > Hello, World!
}
+
だけは println
のどのオーバーロードを使えばよいか解決できなかったため、as Any?
で明示した。
/以上