我正在尝试编写一个带有动态闭包/函数的函数
router.intercept("users/:userId") { (userId: Int) ->
print("User id is $userId")
}
router.intercept("users/:userId/albums/:albumName") { (userId: Int, albumName: String) ->
print("User id is $usrrId, album is $albumName")
}
通过使用命名的元组可以迅速做到这一点,可以用kotlin来实现吗?
n
个参数答案 0 :(得分:0)
一般可以将intercept
重载n次,并使用lambda定义来推断类型:
fun <T1> intercept(path: String, cb: (T1) -> Unit) = ...
fun <T1, T2> intercept(path: String, cb: (T1, T2) -> Unit) = ...
fun <T1, T2, T3> intercept(path: String, cb: (T1, T2, T3) -> Unit) = ...
router.intercept("users/:userId/albums/:albumName") { userId: Int, albumName: String -> }
但是对于intercept
,所有参数看起来都像Any?
,并且您可能不会获得有关用lambda声明的名称或类型的任何信息,并且使用错误的类型将导致异常。 / p>
要充分利用 Kotlin ,可以使用sealed classes和destructuring declarations使其完全类型安全:
sealed class Route
data class UsersRoute(
val userId: Int,
val albumName: String
) : Route()
fun <R: Route> intercept(path: String, cb: (R) -> Unit) = ...
router.intercept("users/:userId") { (userId): UsersRoute -> }
router.intercept<UsersRoute>("users/:userId/albums/:albumName") { (userId, albumName) -> }
如果只具有 users 路线,则甚至不需要通用的密封类方法。