📜  Kotlin 中的多个返回值

📅  最后修改于: 2022-05-13 01:55:37.715000             🧑  作者: Mango

Kotlin 中的多个返回值

Kotlin 是 JetBrains 开发的一种静态类型的通用编程语言,构建了 IntelliJ IDEA、PhpStorm、App code 等世界级的 IDE。它由 JetBrains 于 2011 年首次推出,是一种新的 JVM 语言。 Kotlin 是一种面向对象的语言,是一种比Java“更好的语言”,但仍可与Java代码完全互操作。在本文中,我们将讨论如何返回多个值,但在继续之前,您应该了解一些基本知识,例如当我们声明一个函数时,它执行特定的任务,最后它可能会返回一个值,这就是返回值的含义。但一般来说,函数返回的值不超过一个,所以我们希望你知道这种基本的东西,但如果你不知道的话,请参考这篇文章 Kotlin 函数。

例子

假设我们要计算整数的正负平方根。我们可以通过编写两个不同的函数来解决这个问题:

Kotlin
fun positiveRoot(k: Int): Double {
  require(k >= 0)
  return Math.sqrt(k.toDouble())
}
  
fun negativeRoot(k: Int): Double {
  require(k >= 0)
  return -Math.sqrt(k.toDouble())
}


Kotlin
fun roots(k: Int): Array {
  require(k >= 0)
  val root = Math.sqrt(k.toDouble())
  return arrayOf(root, -root)
 }


Kotlin
class Roots(pos: Double, neg: Double)
fun roots2(k: Int): Roots {
  require(k >= 0)
  val root = Math.sqrt(k.toDouble())
  return Roots(root, -root)
}


Kotlin
fun roots3(k: Int): Pair {
  require(k >= 0)
  val root = Math.sqrt(k.toDouble())
  return Pair(root, -root)
}


另一种方法可能是返回一个数组,所以我们只需要调用一个函数:

科特林

fun roots(k: Int): Array {
  require(k >= 0)
  val root = Math.sqrt(k.toDouble())
  return arrayOf(root, -root)
 }

但是,从返回类型中我们不知道正根或负根是否在位置 0。我们不得不希望文档是正确的;如果没有,请检查源代码。我们可以通过使用具有两个包装返回值的属性的类来进一步改进这一点:

科特林

class Roots(pos: Double, neg: Double)
fun roots2(k: Int): Roots {
  require(k >= 0)
  val root = Math.sqrt(k.toDouble())
  return Roots(root, -root)
}

这具有命名字段的优点,因此我们可以确定哪个是正根,哪个是负根。自定义类的替代方法是使用 Kotlin 标准库 Pair 类型。这种类型简单地包装了两个值,它们通过第一个和第二个字段访问:

科特林

fun roots3(k: Int): Pair {
  require(k >= 0)
  val root = Math.sqrt(k.toDouble())
  return Pair(root, -root)
}

这在清楚每个值的含义时最常使用。例如,返回货币代码和金额的函数不一定需要自定义类,因为很明显哪个是哪个。此外,如果函数是本地函数,您可能会觉得创建自定义类对于在成员函数之外不可见的东西来说是不必要的样板。与往常一样,最合适的选择将取决于具体情况。

我们可以通过在调用者站点上使用解构声明来进一步改进这一点。解构声明允许将值自动提取到单独的变量中:

val (pos, neg) = roots3 (16)

请注意,变量包含在括号块中;第一个值将分配给正根,第二个值将分配给负根。这种语法糖适用于任何实现特殊组件接口的对象。内置的 Pair 类型和所有数据类都自动实现了这个接口。