kotlin - 使用不可为空的默认参数将空值传递给 Kotlin 方法
问题描述
我是 Kotlin 的新手,我发现 Kotlin 与 Java 不同的特性之一是方法默认参数。 https://kotlinlang.org/docs/functions.html#default-arguments
我正在创建一个简单的 Kotlin 应用程序,它将空值传递给具有 2 个不可为空的默认参数的方法,这会导致编译错误 -类型不匹配:推断类型是字符串?但字符串是预期的)。
fun greet(firstName: String = "Hello", lastName: String = "world") {
println("${firstName} ${lastName}")
}
fun main(args: Array<String>) {
greet(args.getOrElse(0) { null }, args.getOrElse(1) { null })
}
一种解决方法是将方法参数更改为可为空,但原始方法的清洁度会丢失。
fun greet(firstName: String?, lastName: String?) {
val firstName2 = firstName ?: "Hello"
val lastName2 = lastName ?: "world"
println("${firstName2} ${lastName2}")
}
fun main(args: Array<String>) {
greet(args.getOrElse(0) { null }, args.getOrElse(1) { null })
}
如果我必须保留原始方法签名,我可以考虑以下替代解决方案。
复制方法签名和方法调用者中的默认参数定义
fun greet(firstName: String = "Hello", lastName: String = "world") {
println("${firstName} ${lastName}")
}
fun main(args: Array<String>) {
greet(args.getOrElse(0) { "Hello" }, args.getOrElse(1) { "world" })
}
根据参数的数量分离方法调用
fun greet(firstName: String = "Hello", lastName: String = "world") {
println("${firstName} ${lastName}")
}
fun main(args: Array<String>) {
when (args.size) {
0 -> greet()
1 -> greet(args[0])
2 -> greet(args[0], args[1])
}
}
Hello world
当没有提供参数时,所有 3 个解决方案都会打印。我想知道是否还有其他更好的替代解决方案。
解决方案
与其使用默认参数,不如明确并验证您的输入,这样您就可以避免歧义:
fun greet(firstName: String, lastName: String) = println("$firstName $lastName")
fun main(args: Array<String>) {
require(args.size == 2) { "Must supply two arguments" }
val (arg1, arg2) = args
greet(arg1, arg2)
}
推荐阅读
- java - 能够在Java扫描仪中输入一个值和一个字符串以输出排名
- linux - Shell 命令不会在 Docker 构建中运行
- arrays - 在 fortran 2018 中编写类的最佳方式(代码审查)
- linux - 使用 valgrind 时在 _dl_start 的堆栈指针下方写入无效
- node.js - router.get 名字和姓氏
- base64 - 使用 Nifi 在 csv 文件中包含图像的 base64 代码
- vba - 在 Word VBA 中提取数学和希腊上标
- iterm2 - iterm2 .zshrc pront 中的三角符号出现问题
- chart.js - 使用 ChartJS 绘制带有平均线的堆叠水平条形图
- c# - 如何在不显示 SaveDialog 的提示的情况下将文件保存在特定位置