Kotlin - интерфейс для пар - PullRequest
2 голосов
/ 30 марта 2020

Я новичок в Kotlin и не знаю, как абстрагировать следующее.

Так, например, у меня есть это:

metadataOf(
   "sId" to "123",
   "uId" to "456"
)

, где metadataOf() выглядит так

fun <VALUE> metadataOf(vararg pairs: Pair<String, VALUE>) =
    MetaData.from(pairs.toMap())!!

Мне бы хотелось, чтобы

metadataOf(
   "sId" to "123",
   "uId" to "456"
)

Для стандартизации, скажем, что-то вроде metadata.message или metadataFrom(message) дало бы мне эти две пары. (И, конечно, в будущем, если я добавлю больше, и я могу легко сделать это в одном месте)

Как бы я go написал об этом?

Любая помощь приветствуется.

Ответы [ 2 ]

1 голос
/ 30 марта 2020

Похоже, что вы действительно хотели, это:

data class SMetadata(val sId: String, val uId: String)

и

//fun metadataOf(vararg sMetadatas: SMetaData) =
//    MetaData.from(sMetaDatas.map { mapOf("sId" to it.sId, "uId" to it.uId) })

и

//metadataOf(
//   SMetaData(sId = "123", uId = "456")
//)

РЕДАКТИРОВАТЬ: очевидно, все Вы действительно хотели было

fun SMetaData.toMetaData() = MetaData.from(mapOf("sId" to sId, "uId" to uId))
0 голосов
/ 30 марта 2020

Вы можете сделать свою собственную реализацию Pair вместе с функцией infix, давайте назовем ее MyPair и присвоим ей ту же реализацию, что и оригинальная:

fun main() {
    listOf(
        "s1" pair "s2",
        "k1" pair "k2"
    )
}

public data class MyPair<out A, out B>(
    public val first: A,
    public val second: B
) : Serializable {
    public override fun toString(): String = "($first, $second)"
}

public infix fun <A, B> A.pair(that: B): MyPair<A, B> = MyPair(this, that)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...