Kotlin中返回特殊对象的函数

oewdyzsn  于 2023-01-17  发布在  Kotlin
关注(0)|答案(3)|浏览(167)

目前我有一个私有函数,它返回一个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中的ad-hoc对象有什么意义呢?

jmp7cifd

jmp7cifd1#

由于类型不能在语言中表示,因此使用返回类型推断:

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

njthzxwz2#

只需将函数定义为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,但这实际上只是一种类定义😅

pengsaosao

pengsaosao3#

另一种选择是为返回类型创建一个泛型类:

data class OutVal<T>(private var v: T?) {
    fun set(newVal: T) {
        v = newVal
    }

    fun get() = v
}

用法示例:

private fun findUsers(instanceWrapper: ExceptionInstanceWrapper,
                      sender: OutVal<String>, receiver: OutVal<String>) {
        sender.set(userCrud.findOne(instanceWrapper.fromWho))
        receiver.set(userCrud.findOne(instanceWrapper.toWho))
}

val sender = OutVal("")
val receiver = OutVal("")
findUsers(instanceWrapper, sender, receiver)
sender.get() // ...
receiver.get() // ...

相关问题