在Kotlin函数调用中使用默认参数值

刚开始使用一些Kotlin教程,我非常兴奋地使用Kotlin。 在浏览Kotlin视频教程的过程中,我注意到教师没有涉及到如何在调用带默认参数的函数时指定第二个参数的值。 在下面的简单例子中,我展示了addTwo()接受两个参数。 '第一'参数有一个默认值,但'秒'没有。 我将如何调用这个函数,指定我想使用默认值为'第一'与给定的价值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是参数。 错误消息确切地说是什么问题是:

参数没有值传递

在第一个默认参数之后,您必须使用命名参数来调用任何您希望保留为空的参数。 对于你的情况,这将是:

 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运行同样的问题:

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

附加说明:由于您的经验,将默认参数设置为列表中的最后一个参数通常是最佳做法。 有些语言甚至强制这样做,比如Python(除了默认情况下,Python允许强制命名参数,因为按名称调用它们的方式就是在默认参数后面使用参数)。