跳转到内容

Scala/元组

来自维基教科书,开放的书籍,开放的世界

Scala 中的元组是一个不可变的多个类型值的序列。一个简单的例子

val idUsername = (0, "randomusername")
println("Id is: " + idUsername._1) //Prints "Id is: 0".
println("Username is: " + idUsername._2) //Prints "Username is: randomusername".

在第一行中,我们定义一个名为“idUsername”的值,并为其赋值一个包含 2 个值的元组,也称为对。元组由一对匹配的括号定义,包含按顺序排列的每个元素,元素之间用逗号分隔。'0' 是第一个元素,'"randomusername"' 是第二个元素。在第二行中,通过对名为“idUsername”的值调用“_1”方法来访问元组的第一个元素,并打印值 '0'。在第三行中,通过对名为“idUsername”的值调用“_2”方法来访问元组的第二个元素,并打印值 '"randomusername"'。

元组支持轻松地将元素绑定到值

val (id, username) = (0, "randomusername")
println("Id is: " + id) //Prints "Id is: 0".
println("Username is: " + username) //Prints "Username is: randomusername".

在第一行中,使用关键字 "val" 后跟一对括号声明了两个标识符,括号中包含用逗号分隔的标识符。紧随其后是一个等号,等号之后定义了元组 '(0, "randomusername")'。第一个标识符 "id" 绑定到第一个元素 '0',而第二个标识符 "username" 绑定到第二个元素 '"randomusername"'。在第二行中,打印名为 "id" 的值,得到 "Id is: 0",在第三行中,打印名为 "username" 的值,得到 "Username is: randomusername"。

元组的用途之一是返回多个值,而不必从头开始为特定返回值创建类

def getSumAverage(numbers:List[Int]) = {
  val sum = numbers.sum
  val average = (sum:Double) / numbers.length
  (sum, average)
}
val numbers = List(1, 2, 30, 45, 13)
val (sum, average) = getSumAverage(numbers)
println("Sum, average is: " + sum + ", " + average) //Prints "Sum, average is: 91, 18.2".

在前 5 行中,定义了一个名为 "getSumAverage" 的函数,该函数接收一个数字列表,计算给定数字的总和和平均值,并将结果作为元组返回。在第六行中,定义了一个数字列表并将其存储在一个名为 "numbers" 的值中,在第七行中,计算这些数字的总和和平均值并将它们存储在值 "sum" 和 "average" 中。在最后一行中,打印总和和平均值。

三元组和四元组的示例

val (number, weight, name) = (7, 1.05, "Apple")
val (x, y, z, temperature) = (30.0, 100.0, -10.0, -5.3)

还值得注意的是,绑定元素的数量应与 TupleN 的数量完全一致,这意味着以下所有操作都会生成错误

val (number, others) = (7, 1.05, "Apple")
val (number, o, p, q) = (7, 1.05, "Apple")
val (number, _) = (7, 1.05, "Apple")

Python 类似,Scala 中的元组通常用于存储异构值。这意味着当它被传输到其他聚合数据结构(如 List 或 Array)时,它不会对其元素类型进行任何假设。

val t = (1,2,3) // type is Tuple3[Int, Int, Int]
t.productIterator.toList // type is List[Any]
华夏公益教科书