Kotlin:如何使用第一个参数&x27;s默认值,并传递第二个值?

Kotlin:如何使用第一个参数&x27;s默认值,并传递第二个值?,kotlin,default-arguments,Kotlin,Default Arguments,我想知道当您要指定第二个参数的值时,如何使用默认参数调用函数。在下面的简单示例中,我展示了addTwo()接受两个参数。“first”参数有默认值,但“second”参数没有。我将如何调用此函数,指定我希望使用“first”的默认值和“second”的给定值2 调用addTwo(2)会引发错误 fun main(args: Array<String>) { var sum = addTwo(1,2) // works fine var nextSum = add

我想知道当您要指定第二个参数的值时,如何使用默认参数调用函数。在下面的简单示例中,我展示了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
}
fun main(args:Array){
var sum=addTwo(1,2)//工作正常
var nextSum=addTwo(2)//错误:没有为参数second传递值
}
fun addTwo(第一个:Int=0,第二个:Int):Int{
第一次+第二次返回
}

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

没有为参数秒传递值

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

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
,在以下示例中):

注意:您可能会遇到以下问题:

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


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

您应该在问题中添加错误消息文本,因为它很重要,并且准确地说明了错误是什么。“第二个参数没有传递值”我在编辑中添加了错误消息。和固定缩进。学习Kotlin的旁注,请使用
val
,除非您绝对需要在特定情况下使用
var
,否则它不应是默认值
val
是你的朋友。当你有很多默认参数时,你开始更多地使用命名参数,然后顺序就不再那么重要了,因为你必须开始使用命名参数来跳过一些默认参数。你不一定要强迫函数的用户学习更多的参数api,有时使用命名参数,最终会使代码变得混乱。另外,强制使用命名参数意味着如果其他人正在使用该函数,您肯定无法重构名称。默认值和命名参数有一个时间和地点。通常,将默认值放在列表的末尾更安全。我知道,我的大脑更容易将默认值放在列表的末尾,特别是当它们被用作标志时。
fun something(first: Int = 0, second: Date): Date { ... }

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