Kotlin 换行符 - 结果取决于运算符位置

标签 kotlin syntax operators

今天我在 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 上,即使这对我来说也毫无意义。

最佳答案

这就是您为可选分号支付的价格。安德烈·布雷斯拉夫 (Andrey Breslav) 在他的一次演讲中说,这是有意的行为。像 + 或 * 这样的二元运算符应该放在顶行,而不是底行。如果要将它们放在底线,请使用括号:

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

关于Kotlin 换行符 - 结果取决于运算符位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59712664/

相关文章:

c++ - 一道C++语法问题

c - "int main (vooid)"?这是如何运作的?

javascript - "|"(管道)运算符的功能是什么?

Kotlin 将函数列表发送到

Kotlin - "run"用于静态 Java 方法

php - PHP中的 ' and "有什么区别?

r - R 冒号 v. 中函数内子集的参数大于或等于

kotlin - 在git bash中编译我的Kotlin测试

android - 从 Moshi 类型适配器的具体泛型类型中获取 ParameterizedType

InnerHtml 的 Javascript 变量不起作用