在 Kotlin 中返回临时对象的函数

Function returning ad-hoc object in Kotlin

目前我有一个私有函数,它 return 是一个 Pair<User, User> 对象。第一个用户是东西的发送者,第二个用户是那个东西的接收者。

我认为这个 Pair<User, User> 不够自我解释 - 或者如果你愿意的话也很干净 - 即使它只是一个私有函数。

是否可以 return 使用这样的临时对象:

private fun findUsers(instanceWrapper: ExceptionInstanceWrapper): Any {
    return object {
        val sender = userCrud.findOne(instanceWrapper.fromWho)
        val receiver = userCrud.findOne(instanceWrapper.toWho)
    }
}

并像这样使用 returned 值:

// ...
val users = findUsers(instanceWrapper)
users.sender // ...
users.receiver // ...
// ...

?

如果不是,Kotlin 中的临时对象有什么意义?

由于语言无法表示类型,使用return类型推断:

class Example {
    private fun findUsers(instanceWrapper: ExceptionInstanceWrapper) =
        object {
            val sender = userCrud.findOne(instanceWrapper.fromWho)
            val receiver = userCrud.findOne(instanceWrapper.toWho)
        }

    fun foo() = findUsers(ExceptionInstanceWrapper()).sender
}

另一种选择是设计一个数据 class:

class Example {
    private data class Users(val sender: User, val receiver: User)
    private fun findUsers(instanceWrapper: ExceptionInstanceWrapper): Users {
        return Users(
            sender = userCrud.findOne(instanceWrapper.fromWho),
            receiver = userCrud.findOne(instanceWrapper.toWho)
        )
    }

    fun foo() = findUsers(ExceptionInstanceWrapper()).sender
}

只需将函数定义为 lambda。

这是我刚刚在另一个上下文中作为示例编写的简单对象:

private val Map = {
    val data = IntArray(400)

    for (index in data.indices) {
        data[index] = index * 3
    }

    object {
        val get = { x: Int, y: Int ->
            data[y * 20 + x]
        }
    }
}

fun main() {
    val map = Map()
    println(map.get(12,1))
}

不幸的是,您不能分配类型名称,因此它可以用作 return 值但不能用作参数。也许他们会让这成为可能,所以我们最终可以做 OOP JS 风格。

或者,他们可以实现等同于函数类型的对象类型,但最终可能过于冗长。然后你可以做一个 typedef 但那实际上只是一种 class 定义