函数在Kotlin中返回ad-hoc对象

时间:2015-10-06 19:32:32

标签: kotlin

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

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

是否可以使用这样的ad-hoc对象返回:

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

并使用返回值,如下所示:

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

如果没有,Kotlin的临时对象有什么意义?

2 个答案:

答案 0 :(得分:5)

由于无法在语言中表示类型,请使用返回类型推断:

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 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
}

答案 1 :(得分:1)

只需将您的函数定义为 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))
}

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

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