可以返回某些东西或不返回任何东西的函数

时间:2021-04-23 15:01:27

标签: kotlin

是否可以在 Kotlin 中定义一个可以返回某些内容或不返回任何内容的函数?我想也许可以使用 Any 作为返回类型,但这仍然需要函数返回一些东西,尽管当返回类型为 Any 时,也许有一种方法可以返回一个 Unit?

我还发现了“Nothing”:

<块引用>

没有没有实例。可以用Nothing来表示“一个永远不存在的值”:例如,如果一个函数的返回类型为Nothing,则表示它永远不会返回(总是抛出异常)。

不幸的是,这将引发异常。这太糟糕了。我想知道他们为什么会抛出异常?

3 个答案:

答案 0 :(得分:2)

你可以将结果包装在一个密封的类中

sealed class Result<out T> {
    data class Success<out T>(val value: T): Result<T>()
    object Failure: Result<Nothing>()
}

然后你可以调用它

fun <Type>calculateResult(...): Result<Type> {
   //calculate and return some implementation
}

然后

val result = calculateResult(inputs)
when (result) {
   is Success -> {
       val value = success.value
   }
   is Failure -> {
       //Do something like show an error the user you know your value is Nothing
   }

}

答案 1 :(得分:1)

您可以只使用可为空的返回类型。

否则,要解决是否可以返回 Unit,您可以。 Unit 只是一个 Kotlin 对象,因此您可以通过名称获取实例:

return Unit

不过我不推荐它,有很多更好的选择。

关于Nothing,它是一种特殊类型,用于表示永远不会返回的函数。因此,如果我想编写一个抛出异常的函数,我可以使用 Nothing 返回类型来实现。然后推理引擎知道我的函数调用之后的任何内容都不会被执行。

答案 2 :(得分:0)

好吧,如果你仔细想想,一个函数不能返回什么,因为调用它的结果是什么?你有没有价值,或者什么都没有?如果你把结果赋值给一个变量,但是没有结果,这个变量就没有值,那是什么?该函数必须定义为始终返回something 或始终返回nothing,因此您始终知道是否有返回值及其可能的类型。否则我们就会进入哲学领域!

事实上在 Kotlin 中,函数总是返回 something - 如果你不指定类型,比如 Java 中的 void 函数,它会默认返回 Unit .这是一个特殊的值,它表示一个不返回结果的函数,但它仍然是一个返回的结果类型。这不是没什么,而是一件事。每个函数都必须返回一个东西。

因此,如果要将返回的事物定义为“表示事物的值”“不表示任何事物的值”,则需要一个类型能够表达这两种想法。我认为您有三种基本方法:

  • 使用特定值来表示“无值”,例如-1 表示 Int,“NO_VALUE”表示 String,诸如此类
  • 创建一个定义自身“无值”版本的类型,例如其中一个答案中的 Result 类型、Java 中的 Optional 类型等
  • 只需使用 null 因为每种类型的可为空版本都内置在 Kotlin 的类型系统中,并且标准库旨在处理它们。 Check out these features built around working with nulls

使用可空类型 IMO - 返回 String? 或其他任何内容,如果结果为非空,则对该值执行某些操作。如果它为空,则忽略它。 Kotlin 让这一切变得非常简单!如果您到了需要滚动特殊类型的地步,您可能会知道为什么需要它而不是您的好朋友null