在行首使用数学运算符

时间:2019-04-09 08:54:56

标签: kotlin

对于我对Kotlin的数学算术常识,我有一个基本问题:

我正在写一个方程式,但我在第二行上错误地加了加号,这导致我的方程式无法如以下示例所示工作:

val x = 2 + 3 //x = 5 CORRECT

val x = 2 +
    3 //x = 5 CORRECT

val x = 2
    + 3 //x = 2 WRONG

我的问题是:为什么Kotlin在最后一个示例中没有显示任何错误消息? Kotlin如何解释“ +3”行?

2 个答案:

答案 0 :(得分:4)

val x = 2是正确的表达式,因此编译器将其用作完整表达式。

+ 3是正确的表达式,尽管它什么也不做。

val x = 2 +是未完成的表达式-编译器正在尝试使用下一行完成它。

答案 1 :(得分:1)

这是Kotlin在行尾采用分号的一种不幸结果。

在Java之类的语言中,每个语句都必须以分号结尾,因此没有歧义。

Kotlin allows可以省略分号,这很方便。但这有点急于求成:它会在每行的末尾推断一个单独有意义的行,而忽略以下几行。对于那些喜欢将运算符放在行首而不是行尾的人来说,这很烦人。

在大多数情况下,下一行本身并没有多大意义,因此会出现编译器错误,以警告您该问题。不幸的是,您发现以下行 有效的罕见情况之一,因此没有错误! (Kotlin有一个unary plus来匹配其一元减号,因此+3是一个与-4一样的数字。而一个数字本身就是有效的表达式.Kotlin计算该值,然后丢弃它。)

解决方案是:

  • 将整个表达式放在一行上。 (如果很长,那将很笨拙!)
  • 将运算符放在上一行的末尾。 (这显然是语言设计师所期望的,但是我们中有些人发现逻辑性和清晰度不够。)
  • 防止第一行本身变得有意义。

我发现做最后一个的最好方法是使用括号:

val x = (2
         + 3)

它看起来很尴尬,但在较长的表达式上却能很好地工作-不理想,但有必要,除非/直到Kotlin对在哪里使用分号变得更聪明为止。