Kotlin:元组类型

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存储库中找到更多填充的示例。