Kotlin: The Tuple Type
用Kotlin的表现力写一个元组类型非常容易。我在测试中表达的目标如下:
能够定义最多5个元素的元组,并能够在由2个元素表示的测试中使用占位符等索引来检索元素,如下所示:
1 2 3 | val tup = Tuple("elem1","elem2") assertThat(tup._1).isEqualTo("elem1") assertThat(tup._2).isEqualTo("elem2") |
能够按照以下方式解构组成类型:
1 2 3 4 5 | val tup = Tuple("elem1","elem2") val (e1, e2) = tup assertThat(e1).isEqualTo("elem1") assertThat(e2).isEqualTo("elem2") |
实作
以下是整个由2个元素组成的元组的实现:
1 | data class Tuple2<out A, out B>(val _1: A, val _2: B) |
AKotlin数据类提供了所有基本支持,能够使用以下表达式来检索单个字段并进行解构:
1 | val (e1, e2) = Tuple2("elem1","elem2") |
此时,我需要做的就是提供一个帮助程序,该帮助程序根据所提供的参数数量创建适当大小的元组,其定义如下:
1 2 3 4 5 6 7 | object Tuple { operator fun invoke(_1: A): Tuple1 = Tuple1(_1) operator fun invoke(_1: A, _2: B): Tuple2 = Tuple2(_1, _2) operator fun invoke(_1: A, _2: B, _3: C): Tuple3 = Tuple3(_1, _2, _3) operator fun invoke(_1: A, _2: B, _3: C, _4: D): Tuple4 = Tuple4(_1, _2, _3, _4) operator fun invoke(_1: A, _2: B, _3: C, _4: D, _5: E): Tuple5 = Tuple5(_1, _2, _3, _4, _5) } |
这使我可以使用如下所示的结构来定义不同大小的元组:
1 2 3 | val tup2 = Tuple("elem1","elem2") val tup3 = Tuple("elem1","elem2","elem3") val tup4 = Tuple("elem1","elem2","elem3","elem4") |
对于更多的扭曲,通常对类型是具有2个元素的元组的别名,而三重类型是3个元素的元组的别名。可以通过以下方式在Kotlin中轻松定义:
1 2 | typealias Pair = Tuple2 typealias Triple = Tuple3 |
确实简单!可以在myGitHub存储库中找到更多填充的示例。