目前我有一个返回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的临时对象有什么意义?
答案 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 但这实际上只是一种类定义?