丢弃返回值以返回单位?
我只是从kotlin开始,所以,如果这是一个基本的问题,请原谅我,我做了一些Google搜索,但没有任何有用的东西。
问题是如何将值转换为Unit
。 例如,在斯卡拉,如果我写这样的东西:
def foo: Int = ??? def bar(x: String): Unit = x match { case "error" => println("There was an error") case _ => foo
}
match
expression式的返回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() } }
我的脑海中有三个解决方案可以解决您的问题:
-
when
声明而不是expression式时:fun bar(x: String) { when(x) { "error" -> println("There was an error") else -> foo() } }
-
使用扩展名将值转换为
Unit
:fun Any?.asUnit() = Unit
用法:
fun bar(x: String): Unit = when (x) { "error" -> println("There was an error") else -> foo().asUnit() }
-
换成返回
Unit
的高阶函数,例如fun bar(x: String): Unit = with(x){ when (x) { "error" -> println("There was an error") else -> foo() } }