Есть ли элегантный способ присвоения необнуляемых типов необязательным параметрам? - PullRequest
0 голосов
/ 16 октября 2018

У меня есть следующая функция:

fun leftPad(value: String, length: Int = 3, char: Char = ' '): String = value.padStart(length, char)

Есть ли способ вызвать это и передать значения с обнуляемыми типами необязательным параметрам, как в:

length: Int? = getLength()
char: Char? = getChar()
leftPad(value, length = length, char = char)

Единственный обходной путь, который я попробовал, заключается в следующем:

fun leftPad(value: String, length: Int? = null, char: Char? = null): String {
        val length = length ?: 4
        val char = char ?: ' '
        return value.padStart(length, char)
    }

Он делает то, что я хочу, но скрытое от имени предупреждение меня немного раздражает.

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Это зависит от вашего определения элегантного , но с отражением можно что-то сделать.

Ниже приведен способ (construct) применить карту аргументов к первичному конструкторуи второй способ (constructNullIsDefault), который отфильтровывает значения null перед применением карты (и некоторый синтаксический сахар с переменным Pair, чтобы избежать необходимости создавать карту самостоятельно для каждого вызова)

inline fun <reified X : Any> constructNullIsDefault(vararg arguments: Pair<String, Any?>): X? {
    return construct(arguments.toMap().filterValues { it != null } as Map<String, Any>)
}

inline fun <reified X : Any> construct(arguments: Map<String, Any>): X? {
    val klass = X::class
    val constructor = klass.primaryConstructor!!
    val parameters = constructor.parameters
    val parameterMap =
        arguments.map { argument -> parameters.find { it.name == argument.key }!! to argument.value }.toMap()
    return constructor.callBy(parameterMap)
}

@Test
fun testAbc() {
    val x = "hello"
    val y = null as String?

    val abc = constructNullIsDefault<Abc>("x" to x, "y" to y)
    println(abc)
}
0 голосов
/ 16 октября 2018

В теневом предупреждении просто говорится, что ваш val length скрывает параметр length в методе.Чтобы устранить это, либо введите значения по умолчанию, либо переименуйте свои локальные переменные.Например:

fun leftPad(value: String, length: Int? = null, char: Char? = null): String {
    return value.padStart(length ?: 4, char ?: ' ')
}

или

fun leftPad(value: String, length: Int? = null, char: Char? = null): String {
    val resolvedLength = length ?: 4
    val resolvedChar = char ?: ' '
    return value.padStart(resolvedLength, resolvedChar)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...