Kotlin разрыв строки в суммах - результат зависит от размещения оператора - PullRequest
3 голосов
/ 13 января 2020

сегодня я столкнулся со странным поведением в Kotlin, которое не могу объяснить. С учетом следующего кода:

data class Data(
    val v1: Int,
    val v2: Int,
    val v3: Int)

fun main() {

    val d = Data(1,1,1)

    val sum1 = d.v1 + d.v2 + d.v3
    println("Oneliner: $sum1") // prints: Oneliner: 3

    val sum2 = d.v1 
        + d.v2 
        + d.v3
    println("OperatorFirst: $sum2") // prints: OperatorFirst: 1

    val sum3 = d.v1 + 
        d.v2 + 
        d.v3
    println("OperatorLast: $sum3") // prints: OperatorLast: 3

}

(тестируется по адресу: https://pl.kotl.in/gMjif_6FO)

Теперь, похоже, зависит от того, где вы разместите оператор +, чтобы получить правильный результат 3. Однако IDE не показывает, что со второй версией может быть что-то не так, и я не смог найти никакой информации о том, почему этот случай будет вести себя по-другому.

Вопрос по программному обеспечению В инженерном пространстве также говорится, что несколько руководств по кодированию предлагают поставить оператора в начале строки: https://softwareengineering.stackexchange.com/questions/93670/line-break-before-after-operator

Кроме того, единственное объяснение, которое я мог найти для этого поведения, состоит в том, что + в начале строки интерпретируется как унарный оператор плюс. https://www.programiz.com/kotlin-programming/operators#unary Однако даже это не имеет смысла для меня на val

1 Ответ

2 голосов
/ 13 января 2020

Это цена, которую вы платите за дополнительные точки с запятой. Андрей Бреслав сказал в одной из своих лекций, что это намеренное поведение. Бинарные операторы, такие как + или *, должны располагаться в верхней строке, а не в нижней. Если вы хотите разместить их в нижней строке, используйте скобки:

val sum = (1
        + 1 
        + 1)
println(sum) // prints: 3
...