如何使用默认值组合两个函数?

How can I combine two functions using default value?

我想把这两个功能结合起来,但我不知道怎么做。有人可以帮帮我吗?

fun String?.pluralize(count: Int): String? {
    return if (count != 1) {
        this + 's'
    } else {
        this
    }
}

fun String?.pluralize(count: Int, plural: String?): String? {
    return if (count != 1) {
        plural ?: this + 's'
    } else {
        this
    }
}

获得所需结果和处理输入 Stringnull 情况的正确方法应该如下:

fun String?.pluralize(count: Int, plural: String? = null): String? = when {
    count == 1 || this == null -> this
    else -> plural ?: "${this}s"
}

这里真正的问题是你对这段代码有特殊的要求,而你在问题中没有提到这一点。这就是为什么您得到的所有答案都不适合您的原因。这个附加要求是您不仅需要从 Kotlin 使用此功能,还需要从 Java and/or 一些基于反射的框架使用此功能。而且变化很大。

您问题的常规答案是您只需要使用第二个函数,但将其参数声明为:plural: String? = null。这足以在 Kotlin 中按预期使用它:

"hour".pluralize(2) // hours
"hour".pluralize(2, "foo") // foo

但是从 Java 中你只会看到一个接收 3 个参数的函数:

PluralizeExtensionKt.pluralize("hour", 2, null); // hours
PluralizeExtensionKt.pluralize("hour", 2, "foo"); // foo
PluralizeExtensionKt.pluralize("hour", 2); // compile error

要解决这个问题,您需要额外注释这个函数@JvmOverloads。这将在 Java 字节码中生成两个函数,因此以上所有示例都将按您的预期工作。

生成的函数如下所示:

@JvmOverloads
fun String?.pluralize(count: Int, plural: String? = null): String? {
    return if (count != 1) {
        plural ?: this + 's'
    } else {
        this
    }
}

不过,我建议使用 Михаил Нафталь 答案中提供的实现。它修复了您代码中的一个额外错误并且更加简洁。

您可以在第二个参数中添加默认值作为null

fun String?.pluralize(count: Int, plural: String?=null): String? {
    return if (count != 1) {
        plural ?: this + 's'
    } else {
       this
    }
}