Используйте переменную для именованного параметра в kotlin

У меня есть функция, определенная следующим образом:

getTypeB(id: String, 
         valA1: TypeA = defaultA1
         valA2: TypeA = defaultA2,
         valA3: TypeA = defaultA3 ) : TypeB {}

Я знаю, что, используя именованные аргументы, я могу вызвать вышеуказанную функцию только с некоторыми из значений, например

getTypeB(id,
         valA2 = someValueOfTypeA )

Мой вопрос в том, есть ли здесь какой-либо способ, чтобы буквальный текст valA2 был переменной. Я хотел иметь возможность вызывать getTypeB откуда-то еще, где они не будут знать имена аргументов аргументов, если они не будут переданы. Так есть ли способ использовать переменную для именованного аргумента? Если нет, есть ли другая альтернатива, которую я могу использовать здесь?


person jadeblack12    schedule 29.01.2019    source источник
comment
Возможный дубликат Рефлексивный вызов функции и использование параметров по умолчанию   -  person Lino    schedule 30.01.2019


Ответы (1)


Вы можете использовать map для этого:

fun getTypeB(id: String,
             varsMap: Map<String, TypeA>): TypeB {
    val valA1: TypeA = varsMap.getOrElse("valA1") { defaultA1 }
    val valA2: TypeA = varsMap.getOrElse("valA2") { defaultA2 }
    val valA3: TypeA = varsMap.getOrElse("valA3") { defaultA3 }
    //
}

val args = mapOf(
        "valA1" to someValueOfTypeA,
        "valA2" to someValueOfTypeA)
getTypeB(id, args)
person Akaki Kapanadze    schedule 29.01.2019
comment
Да, это мой резервный подход, если я не могу найти ничего другого. - person jadeblack12; 30.01.2019