使用默认参数不传递任何值给函数
Pass no value to function with default parameters
我有这个 Kotlin 函数:
fun doSomething(user: User = defaultUser) {
//do something
}
我从另一个地方调用它:
val user: User? = getUser()
if (user == null) {
doSomething()
} else {
doSomething(user)
}
是否可以改进此代码?我觉得这个“if/else”有点乱。可以这样做吗?
doSomething(user ?: NoValue)
你可以这样做:
getUser()?.let { // user is not null
doSomething(it)
} ?: run { // user is null here
doSomething()
}
(cf: )
我不认为你可以在不让代码难以理解的情况下做更短的事情 编辑 2:实际上你可以,请参阅评论
编辑:我个人会像这样处理函数内的可空变量:
fun doSomething(user: User?) {
val correctUser = user ?: defaultUser
//do something
}
所以你可以像这样使用函数:
doSomething(getUser())
您可以将其缩减为 user?.run(::doSomething) ?: doSomething()
(如果 doSomething
不 return null)但我不知道您为什么要这样做!
老实说,if/else 对我来说读起来不错,把它放在一行上,没有大括号,它既漂亮又紧凑。不幸的是,我不认为您可以有条件地将参数添加到函数调用中(并且当您有几个参数时,处理默认参数会变得笨拙)。
我同意@benjiii 的观点,如果您不需要将 null 用作合法值,那么拥有一个可为 null 的参数并在内部处理默认值可能会更好
我同意 cactustictacs 的观点,将它放在一行上就很简单明了。然而,如果你经常使用它并且它困扰着你,那么将它包装在一个没有默认参数的函数中就足够了:
fun doSomethingSensibly(user: User?) =
if (user == null)
doSomething()
else
doSomething(user)
可用作:
doSomethingSensibly(getUser())
我有这个 Kotlin 函数:
fun doSomething(user: User = defaultUser) {
//do something
}
我从另一个地方调用它:
val user: User? = getUser()
if (user == null) {
doSomething()
} else {
doSomething(user)
}
是否可以改进此代码?我觉得这个“if/else”有点乱。可以这样做吗?
doSomething(user ?: NoValue)
你可以这样做:
getUser()?.let { // user is not null
doSomething(it)
} ?: run { // user is null here
doSomething()
}
(cf:
我不认为你可以在不让代码难以理解的情况下做更短的事情 编辑 2:实际上你可以,请参阅评论
编辑:我个人会像这样处理函数内的可空变量:
fun doSomething(user: User?) {
val correctUser = user ?: defaultUser
//do something
}
所以你可以像这样使用函数:
doSomething(getUser())
您可以将其缩减为 user?.run(::doSomething) ?: doSomething()
(如果 doSomething
不 return null)但我不知道您为什么要这样做!
老实说,if/else 对我来说读起来不错,把它放在一行上,没有大括号,它既漂亮又紧凑。不幸的是,我不认为您可以有条件地将参数添加到函数调用中(并且当您有几个参数时,处理默认参数会变得笨拙)。
我同意@benjiii 的观点,如果您不需要将 null 用作合法值,那么拥有一个可为 null 的参数并在内部处理默认值可能会更好
我同意 cactustictacs 的观点,将它放在一行上就很简单明了。然而,如果你经常使用它并且它困扰着你,那么将它包装在一个没有默认参数的函数中就足够了:
fun doSomethingSensibly(user: User?) =
if (user == null)
doSomething()
else
doSomething(user)
可用作:
doSomethingSensibly(getUser())