如何在Kotlin中的函数之间传播默认参数?

Kir*_*man 5 kotlin

Kotlin具有函数和构造函数参数的默认参数.现在,我有一个功能

fun foo(bar: String = "ABC", baz: Int = 42) {}
Run Code Online (Sandbox Code Playgroud)

我想从不同的地方调用它,但也保留不传递参数的可能性,而是使用默认值.

我知道,我可以在调用函数中声明默认参数

fun foo2(bar: String = "ABC", baz: Int = 42) {
    // do stuff
    foo(bar, baz)
}

fun foo3(bar: String = "ABC", baz: Int = 42) {
    // do other stuff
    foo(bar, baz)
}
Run Code Online (Sandbox Code Playgroud)

但现在我的默认参数foo是无意义的,因为它总是被覆盖,我已经复制了所有调用函数中的默认参数.那不是很干.

有没有更好的方法来传播默认参数?

Kir*_*man 1

按照指南的鼓励回答我自己的问题。


您可以做的是将调用函数中的参数声明为可为空并用作null默认参数:

fun foo2(bar: String? = null: Int? = null) {
    // do stuff
    foo(bar, baz)
}

fun foo3(bar: String? = null, baz: Int? = null) {
    // do other stuff
    foo(bar, baz)
}
Run Code Online (Sandbox Code Playgroud)

然后,使用elvis 运算符之一来使用默认值(如果null提供)。

fun foo(bar: String? = null, baz: Int? = null) {
    val realBar = bar ?: "ABC"
    val realBaz = baz ?: 42
}
Run Code Online (Sandbox Code Playgroud)

如果您正在处理类而不是函数,则可以提取构造函数的属性并在那里分配默认值:

class Foo(bar: String? = null, baz: Int? = null) {
    val bar = bar ?: "ABC"
    val baz = baz ?: 42
}
Run Code Online (Sandbox Code Playgroud)

或者,如果您的类是 adata class并且您希望在主构造函数中拥有属性,则可以声明一个工厂方法来处理默认值:

class Foo(val bar: String, baz: Int) {
    companion object {
        fun create(bar: String? = null, baz: Int? = null) = Foo(bar ?: "ABC", baz ?: 42)
    }
}
Run Code Online (Sandbox Code Playgroud)