Kotlin:如何使用第一个参数的默认值进行函数调用并为第二个参数传递一个值?

Kotlin: how to make a function call using the first argument's default value and passing a value for the second?

我想知道当您想指定第二个参数的值时如何使用默认参数调用函数。在下面的简单示例中,我展示了 addTwo() 有两个参数。 'first' 参数有一个默认值,但 'second 没有。我将如何调用此函数指定我想使用 'first' 的默认值和 'second' 的给定值 2?

调用 addTwo(2) 会引发错误。

fun main(args: Array<String>) {
    var sum = addTwo(1,2)    // works fine
    var nextSum = addTwo(2)  // ERROR: No value passed for parameter second 
}

fun addTwo(first: Int = 0, second: Int): Int {
    return first + second
}

这是一个错误,因为 Kotlin 不知道您为什么省略了第二个参数。 first可以默认,但不能默认second。因此,当您只传入一个参数时,它是针对参数 first 的。错误消息准确说明了问题所在:

no value passed for parameter second

对于第一个要留空的默认参数之后的任何内容,您必须调用 using named arguments。对于您的情况,这将是:

addTwo(second = 2) // first defaulted to 0

如果您的默认参数按其他顺序排列,您的调用就没问题了。

fun addTwo(first: Int, second: Int = 0): Int{
    return first + second
}

addTow(2)  // no error, second defaulted to 0

如果两个参数的数据类型不同,您会看到不同的不太清楚的错误,让您知道第一个参数 (Int) 的类型是预期的,而不是第二个参数的类型(以下示例中的Date):

fun something(first: Int = 0, second: Date): Date { ... }

something(Date()) // ERROR: Type mismatch: inferred type is java.util.Date but kotlin.Int was expected

注意: 您可以 运行 进入与 vararg 相同的问题:

Only one parameter may be marked as vararg. If a vararg parameter is not the last one in the list, values for the following parameters can be passed using the named argument syntax

附加说明:根据您的经验,将默认参数设置为列表中的最后一个参数通常是最佳做法。有些语言甚至强制这样做,例如 Python(除了 Python 允许在默认值之后强制命名参数,因为让你按名称调用它们是你如何绕过默认参数之后的参数) .