首页 > 解决方案 > Kotlin Koans:命名参数解决方案

问题描述

我正在Kotlin Koans上练习 Kotlin,并且正在回答Named Arguments问题。

命名参数

默认和命名参数有助于最大限度地减少重载的数量并提高函数调用的可读性。库函数 joinToString 使用参数的默认值声明:

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

它可以在字符串集合上调用。仅指定两个参数使函数 joinOptions() 以 JSON 格式返回列表(例如,“[a, b, c]”)

答案:

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

将“[”添加到集合的开头,将“]”添加到集合的末尾。但是,我尝试使用和不使用 打印集合joinOptions(),它们都有相同的结果:

val collection: Collection<Int> = listOf(1, 2, 3)
fun joinNumbers(numbers: Collection<Int>) = numbers.joinToString(prefix = "[[", postfix = "]")
println(collection) // prints [1, 2, 3]
println(joinNumbers((collection))) // prints [1, 2, 3]

所以我只是好奇我是否遗漏了什么?- 他们在这个问题上的目的是什么?

标签: kotlincollections

解决方案


println(collection)调用对象toString()上的方法Collection,一些集合会以如下格式打印它们的内容:

[1, 2, 3]

这确实相当于调用

collection.joinToString(prefix = "[", delimiter = ", ", postfix = "]")

但是,您无法修改此行为,因此,例如,如果您想将集合中的每个元素打印在单独的行上,您必须编写自己的toString(). 这是joinToString()派上用场的地方,您可以这样做

collection.joinToString(delimiter = "\n")

请注意,您不需要传递参数prefixpostfix使默认值适合您的用例。

Koans 示例可能不那么令人困惑,但它确实说明了命名参数和默认值的用法。


推荐阅读