我有一些构造函数和函数,我希望始终使用命名参数调用它们。有没有办法要求这个?
我希望能够为具有许多参数的构造函数和函数执行此操作,并且对于那些在使用命名参数时更清楚地读取的函数,等等。
答案 0 :(得分:18)
通过使用stdlib中的Nothing
,我找到了在Kotlin 1.0中执行此操作的方法:
/* requires passing all arguments by name */
fun f0(vararg nothings: Nothing, arg0: Int, arg1: Int, arg2: Int) {}
f0(arg0 = 0, arg1 = 1, arg2 = 2) // compiles with named arguments
//f0(0, 1, 2) // doesn't compile without each required named argument
/* requires passing some arguments by name */
fun f1(arg0: Int, vararg nothings: Nothing, arg1: Int, arg2: Int) {}
f1(arg0 = 0, arg1 = 1, arg2 = 2) // compiles with named arguments
f1(0, arg1 = 1, arg2 = 2) // compiles without optional named argument
//f1(0, 1, arg2 = 2) // doesn't compile without each required named argument
由于Array<Nothing>
在Kotlin中是非法的,因此无法创建vararg nothings: Nothing
的值以传入(我认为没有反映)。这看起来有点像黑客,我怀疑类型为Nothing
的空数组的字节码有一些开销,但似乎有效。
此方法不适用于无法使用vararg
的数据类主构造函数,但这些构造函数可以标记为private
,辅助构造函数可以与vararg nothings: Nothing
一起使用。
然而,这种方法在Kotlin 1.1中不起作用:&#34; Forbidden vararg参数类型:Nothing&#34;。 :-(
谢天谢地,希望在Kotlin 1.1中不会丢失。您可以通过使用私有构造函数(如Nothing
)定义自己的空类来复制此模式,并将其用作第一个varargs参数。当然,如果正式支持强制命名参数,则不必这样做。