[毎日Kotlin] Day3. Named arguments(名前付き引数)

2018.01.15

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

毎日Kotlinシリーズです。

このシリーズを初めての方はこちらです。「毎日Kotlin」はじめました | Developers.IO

問題

3日目は、名前付き引数を使ってみる問題です。

Named arguments | Try Kotlin

Default and named arguments help to minimize the number of overloads and improve the readability of the function invocation. The library function joinToString is declared with default values for parameters:

fun joinToString(
    separator: String = ", ",
    prefix: String = "",
    postfix: String = "",
    /* ... */
): String

It can be called on a collection of Strings. Specifying only two arguments make the function joinOptions() return the list in a JSON format (e.g., "[a, b, c]")

fun joinOptions(options: Collection<String>) = options.joinToString(TODO())

狙い

ここで考えて欲しい問題の意図はなんだろうか?

Javaにはなかった、名前付き引数を使ってみます。もちろん、引数の順番で渡すことも可能です。引数の順番を覚えないといけなかったのが、定義順ではなく、意図通りの順番で引数に渡すことができるので読みやすくなり便利になります。

解答例

何も省略しないで、名前付き引数を使った場合

fun joinOptions(options: Collection<String>) = options.joinToString(prefix = "[", separator = ", ", postfix = "]")

すでにデフォルト値が入っているものを考慮した場合

joinToString - Kotlin Programming Language

public fun <T> Iterable<T>.joinToString(separator: CharSequence = ", ", prefix: CharSequence = "", postfix: CharSequence = "", limit: Int = -1, truncated: CharSequence = "...", transform: ((T) -> CharSequence)? = null): String {
    return joinTo(StringBuilder(), separator, prefix, postfix, limit, truncated, transform).toString()
}

separatorのデフォルトが", "になっているため、省略可能。

fun joinOptions(options: Collection<String>) = options.joinToString(prefix = "[", postfix = "]")

名前付き引数を使わない場合

定義の順番通りに引数を渡す

fun joinOptions(options: Collection<String>) = options.joinToString(", ", "[", "]")

名前付き引数を順不同にわたす

以下すべて正解です。コード上の問題はないが、人間が理解し難いため、意図が伝わるように渡したほうが読みやすい。

[a, b, c]と出力したいので[,]の順番だと読みやすい。

fun joinOptions(options: Collection<String>) = options.joinToString(prefix = "[", separator = ", ", postfix = "]")
fun joinOptions(options: Collection<String>) = options.joinToString(prefix = "[", postfix = "]", separator = ", ")
fun joinOptions(options: Collection<String>) = options.joinToString(separator = ", ", prefix = "[", postfix = "]")
fun joinOptions(options: Collection<String>) = options.joinToString(postfix = "]", separator = ", ", prefix = "[")
fun joinOptions(options: Collection<String>) = options.joinToString(postfix = "]", prefix = "[", separator = ", ")

あとがき

Day4.でまたお会いしましょう。