例如,您可能具有带有复杂签名和varargs的函数:

fun complicated(easy: Boolean = false, hard: Boolean = true, vararg numbers: Int)

您应该能够像下面这样调用此函数是有道理的:
complicated(numbers = 1, 2, 3, 4, 5)

不幸的是,编译器不允许这样做。

是否可以对varargs使用命名参数?有什么聪明的解决方法吗?

最佳答案

可以通过在vararg之后移动可选参数来解决此问题:

fun complicated(vararg numbers: Int, easy: Boolean = false, hard: Boolean = true) = {}

然后可以这样称呼它:
complicated(1, 2, 3, 4, 5)
complicated(1, 2, 3, hard = true)
complicated(1, easy = true)

请注意,结尾的可选参数需要始终与名称一起传递。
这不会编译:
complicated(1, 2, 3, 4, true, true) // compile error

另一个选择是将vararg糖留给显式数组参数:
fun complicated(easy: Boolean = false, hard: Boolean = true, numbers: IntArray) = {}

complicated(numbers = intArrayOf(1, 2, 3, 4, 5))

10-04 13:56