LoginSignup
3
0

More than 3 years have passed since last update.

【Kotlin】パイプライン関数を作る

Posted at

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? で明示した。

/以上

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