如何使用默认值组合两个函数?
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
}
}
获得所需结果和处理输入 String
的 null
情况的正确方法应该如下:
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
}
}
我想把这两个功能结合起来,但我不知道怎么做。有人可以帮帮我吗?
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
}
}
获得所需结果和处理输入 String
的 null
情况的正确方法应该如下:
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
}
}