【问题标题】:Pass no value to function with default parameters使用默认参数不向函数传递值
【发布时间】:2020-10-02 14:29:19
【问题描述】:

我有这个 Kotlin 函数:

fun doSomething(user: User = defaultUser) {
  //do something
}

我从另一个地方调用它:

val user: User? = getUser()
if (user == null) {
  doSomething()
} else {
  doSomething(user)
}

是否可以改进此代码?我认为这个“if/else”有点混乱。有可能做这样的事情吗?

doSomething(user ?: NoValue)

【问题讨论】:

  • 这和doSomething(user ?: defaultUser)有什么不同?
  • 问题是我从一个不知道(也不应该)默认用户的类中调用 'doSomething` 函数。

标签: kotlin default-value


【解决方案1】:

您可以将其缩减为 user?.run(::doSomething) ?: doSomething()(如果 doSomething 不返回 null)但我不知道您为什么要这样做!

老实说,if/else 读起来对我来说很好,将它放在没有大括号的一行上,它既美观又紧凑。不幸的是,我认为您不能有条件地将参数添加到函数调用中(当您有几个参数时,处理默认参数可能会变得笨拙)。

我同意@benjiii,如果你不需要使用 null 作为合法值,最好有一个可为空的参数并在内部处理默认值

【讨论】:

  • if (user == null) doSomething() else doSomething(user) 适合喜欢代码而不是文字的人
【解决方案2】:

你可以这样做:

getUser()?.let { // user is not null
  doSomething(it)
} ?: run { // user is null here
  doSomething()
}

(参见:Swift 'if let' statement equivalent in Kotlin

我认为你不能做一些更短的事情而不会使代码难以理解编辑2:实际上你可以,看评论

编辑:我会亲自处理函数内部的可为空变量,如下所示:

fun doSomething(user: User?) {
  val correctUser = user ?: defaultUser
  //do something
}

所以你可以像这样使用函数:

doSomething(getUser())

【讨论】:

  • getUser()?.let { doSomething(it) } ?: doSomething() 不需要run
【解决方案3】:

我同意 cactustictacs,把它放在一行上就很清晰了。但是,如果您经常使用它并且它让您感到困扰,那么将它包装在一个没有默认参数的函数中很容易:

fun doSomethingSensibly(user: User?) =
    if (user == null)
        doSomething()
    else
        doSomething(user)

可以用作:

doSomethingSensibly(getUser())

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-22
    • 1970-01-01
    • 1970-01-01
    • 2016-12-14
    • 2015-10-30
    • 2020-07-29
    • 2018-07-20
    • 1970-01-01
    相关资源
    最近更新 更多