为什么不在Kotlin中传递参数名称就可以调用一个有趣的东西?

时间:2018-07-26 01:24:52

标签: android kotlin

joinToString函数中有4个具有默认值的参数,在我看来,当我省略参数名称时,应该按顺序传递参数值。

所以我认为代码println(letters.joinToString( transform={ it.toLowerCase() } ) )是正确的。

但是实际上代码println(letters.joinToString { it.toLowerCase() } )也正确,为什么?

fun <T> Collection<T>.joinToString(
        separator: String = ", ",
        prefix: String = "",
        postfix: String = "",
        transform: (T) -> String = { it.toString() }
): String {
    val result = StringBuilder(prefix)

    for ((index, element) in this.withIndex()) {
        if (index > 0) result.append(separator)
        result.append(transform(element))
    }

    result.append(postfix)
    return result.toString()
}


fun main(args: Array<String>) {  
    val letters = listOf("Alpha", "Beta")

    println(letters.joinToString { it.toLowerCase() } )               //It's Ok    
    println(letters.joinToString( transform={ it.toLowerCase() } ) )  //It's OK

}

2 个答案:

答案 0 :(得分:6)

因为您使用的是其他语法。

如果方法的最后一个参数是方法引用,则可以省略括号,而只需在函数中加上{括号。

在这种情况下,

it变成您正在传递给函数的T

println(letters.joinToString { it.toLowerCase() } )

以下是您认为要输入的内容。这将无法编译,并且需要命名的参数或参数的顺序正确。您还必须将语法从使用it更改为使用常规函数语法

println(letters.joinToString(it.toLowerCase()))

答案 1 :(得分:0)

除了@Dan的答案外,您无需提供命名参数,但是如果这样做,则您将不得不对以下所有参数(来自documentation)使用命名参数: “所有位置参数都应放在第一个命名参数之前”)。在您的情况下,您要提供的唯一命名参数是最后一个,其他所有参数都具有默认值,因此只要默认值适合您,就不必强迫提供它们。