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

hlu*_*ico 10 default-arguments kotlin

我想知道如果要指定第二个参数的值,如何使用默认参数调用函数.在下面的简单示例中,我展示了addTwo()接受两个参数.'first'参数有一个默认值,但'second'没有.如何调用此函数指定我要使用'first'的默认值,给定值为2的'second'?

调用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
}
Run Code Online (Sandbox Code Playgroud)

Jay*_*ard 29

这是一个错误,因为Kotlin不知道你为什么省略了第二个参数.该first可以默认,但没有second.因此,当您只传入一个参数时,它就是参数first.错误消息确切地说明了问题所在:

没有为参数second传递值

在第一个要保留为空的默认参数之后,必须使用命名参数调用任何内容.对于您的情况,这将是:

addTwo(second = 2) // first defaulted to 0
Run Code Online (Sandbox Code Playgroud)

如果你的默认参数是在另一个顺序,你的电话会很好.

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

addTow(2)  // no error, second defaulted to 0
Run Code Online (Sandbox Code Playgroud)

如果两个参数的数据类型不同,您会看到一个不同的不太清楚的错误,让您知道第一个参数(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
Run Code Online (Sandbox Code Playgroud)

注意: 您可能会遇到同样的问题vararg:

只有一个参数可以标记为vararg.如果vararg参数不是列表中的最后一个参数,则可以使用命名参数语法传递以下参数的值