丢弃返回值以返回单位?

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

问题是如何将值转换为Unit 。 例如,在斯卡拉,如果我写这样的东西:

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

}

matchexpression式的返回types是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 {} ,但似乎有点笨拙,尤其是如果有这样的情况需要完成。

您可以在Any对象上创建扩展方法并调用它 。 我只是更喜欢使用名称discard()而不是toUnit() ,因为我觉得它expression了更好的意图:

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

没有办法做到这一点,但你可以做一个扩展function:

 fun Any?.unit() = Unit 

然后用它作为:

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

或者, when声明而不是expression式时:

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

我的脑海中有三个解决方案可以解决您的问题:

  1. when声明而不是expression式时:

     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的高阶函数,例如

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