【问题标题】:Kotlin is ignoring expressionKotlin 忽略了表达
【发布时间】:2018-02-28 16:21:48
【问题描述】:

我想知道为什么下面的代码会产生奇怪的结果,而编译器没有显示任何错误或警告。这看起来是一个非常有效的错误来源。

    val a = 10 * 20 +
            10 * 30

    val b = 10 * 20
          + 10 * 30

    val c = (
               (10 * 20)
             + (10 * 30)
            )

    val d = (10 * 20)
          + (10 * 30)

    println(a)
    println(b)
    println(c)
    println(d)

输出是:

500
200
500
200

【问题讨论】:

    标签: kotlin


    【解决方案1】:

    Kotlin 有可选的分号,它允许并鼓励源代码省略语句分隔符(即分号 ;)。因此,编译器很难猜出你作为程序员的实际意图:

    val b = 10 * 20
           + 10 * 30
    

    将编译为b = 500 的赋值和导致300 但永远不会被赋值给任何东西的第二条语句(与d 相同)。您如何认为编译器知道第二行实际上是第一个表达式的一部分?它本身就有效。

    thread 提供了更多详细信息。

    【讨论】:

      【解决方案2】:

      看来我很幸运能够使用一个也有一元版本+ 的运算符。 问题是 Kotlin 允许一种实际上什么都不做的表达式:

      12345
      

      我也可以:

      - 12345
      

      这只是一个负数。我也可以有正数:

      + 12345
      

      所以在这种情况下:

      val a = 20 +
              30
      

      我有一个表达式,因为+ 需要另一个参数,可以在下一行找到。

      但是这里我有两个表达方式

      val a = 20
             + 30
      

      变量a 的值为20,第二个表达式什么也不做。

      但是,* 没有一元版本,所以这可行:

      val a = 10 * 
              20 
      

      a == 200,这会导致编译错误:

      val a = 10
              * 20 
      
      Error:(397, 17) Kotlin: Expecting an element
      

      添加分号不会改变任何内容,因为最后一个表达式仍然无效,并导致编译错误。

      而且你总是可以使用括号:

      val x = (10
               + 20)
      

      【讨论】:

      • Java 中不存在该问题,例如由于您有一个强制性的分号,因此可选性会导致某些问题
      猜你喜欢
      • 1970-01-01
      • 2020-01-07
      • 1970-01-01
      • 2012-03-15
      • 1970-01-01
      • 2020-08-22
      • 2021-09-13
      • 2020-08-06
      • 2016-03-30
      相关资源
      最近更新 更多