Котлин динамический ряд параметров в функции? - PullRequest
0 голосов
/ 08 мая 2019

Я пытаюсь написать одну функцию, которая принимает динамическое замыкание / функцию

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

С помощью swift это возможно с помощью именованных кортежей, возможно ли добиться этого с помощью kotlin?

  • Я хочу, чтобы переменные были названы
  • Я хочу иметь возможность поддерживать n количество параметров

1 Ответ

0 голосов
/ 08 мая 2019

Можно перегрузить intercept n-раз в общем и вывести тип с помощью лямбда-определения:

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?, и вы можете этого не делатьполучить любую информацию об имени или типе, который вы объявили с помощью лямбды, и использование неправильного типа приведет к исключениям.

Чтобы использовать Kotlin в полном объеме, вы можете сделать все этобезопасный для типов с запечатанными классами и декларациями деструктурирования :

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 , вы даже не сможетенужен общий и закрытый подход к классу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...