【问题标题】:Discard return value to return Unit?丢弃返回值以返回 Unit?
【发布时间】:2018-05-02 21:55:49
【问题描述】:

我只是从 kotlin 开始,所以,如果这是一个基本问题,请原谅我,我确实做了一些谷歌搜索,但这并没有发现任何有用的东西。

问题是如何将值转换为Unit。 例如,在 scala 中,如果我这样写:

def foo: Int = ???
def bar(x: String): Unit = x match {
  case "error" => println("There was an error")
  case _ => foo      

}

match表达式的返回类型为Any,但被编译器丢弃,函数返回Unit

但是在 kotlin 中做这样的事情:

fun bar(x: String): Unit = when(x) {
 "error" ->  println("There was an error") 
 else -> foo()
}

它抱怨foo 部分:inferred type is Int but Unit was expected

我知道,在这种情况下,我可以摆脱=,而是将主体放在一个块内,这可行,但我正在寻找一个通用的解决方案。到目前为止我能得到的只是foo.let {},但它似乎有点笨拙,特别是如果有很多这样的情况需要完成的话。

【问题讨论】:

标签: kotlin


【解决方案1】:

您可以create an extension method on Any object and call it。我只是更喜欢使用名称discard() 而不是toUnit(),因为我觉得它更能传达意图:

fun Any?.discard() = Unit

fun foo(): Int = 3

fun bar(x: String): Unit = when (x) {
    "error" -> println("There was an error")
    else -> foo().discard()
}

【讨论】:

    【解决方案2】:

    没有开箱即用的方法,但您可以为此创建扩展功能:

    fun Any?.unit() = Unit
    

    然后将其用作:

    fun bar(x: String): Unit = when(x) {
        "error" ->  println("There was an error") 
        else -> foo().unit()
    }
    

    或者,将when 设为语句而不是表达式:

    fun bar(x: String) {
        when(x) {
            "error" ->  println("There was an error") 
            else -> foo()
        }
    }
    

    【讨论】:

      【解决方案3】:

      我想到了三个解决您的问题的方法:

      1. 使when 成为语句而不是表达式,因此不会返回其结果:

        fun bar(x: String) {
             when(x) {
                "error" ->  println("There was an error") 
                else -> foo()
            }
        }
        
      2. 使用扩展将值转换为Unit

        fun Any?.asUnit() = Unit
        

        用法:

        fun bar(x: String): Unit =
           when (x) {
               "error" -> println("There was an error")
                else -> foo().asUnit()
        }
        
      3. 将调用包装成返回Unit的高阶函数调用,例如with:

        fun bar(x: String): Unit = with(x){
            when (x) {
                "error" -> println("There was an error")
                else -> foo()
            }
        }
        

      【讨论】:

        猜你喜欢
        • 2019-05-04
        • 1970-01-01
        • 2013-02-21
        • 1970-01-01
        • 1970-01-01
        • 2021-05-28
        • 2015-11-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多