Kotlin语法疑问:为何‘+ 变量 + 变量’写法不被判定为语法错误?
Kotlin表达式换行引发的隐性Bug
最近碰到一个坑人的低级Bug,问题出在表达式换行的写法上:
val total = anObject.oneLongVariableName + anObject.secondLongVariableName + anObject.thirdLongVariableName + anObject.fourthLongVariableName
这段代码看起来完全合法,编译也能通过,但实际运行时,第三个和第四个变量根本没加到total里——total的值只等于前两个变量的和。
正确的换行写法应该把运算符放在行尾,让编译器明确表达式还未结束:
val total = anObject.oneLongVariableName + anObject.secondLongVariableName + anObject.thirdLongVariableName + anObject.fourthLongVariableName
有意思的是,换成乘法运算符的话,同样的换行写法会直接报语法错误:
val product = anObject.oneLongVariableName * anObject.secondLongVariableName * anObject.thirdLongVariableName * anObject.fourthLongVariableName
但+和-运算符的这种写法却能通过编译,只是逻辑完全失效。根源在于Kotlin的行尾分号推断规则:当换行后的行首是+/-时,编译器会把它当成一元运算符处理,自动给上一行末尾加上分号。也就是说,第一行的表达式到第二个变量就结束了,后面的+ anObject.thirdLongVariableName + ...变成了一个独立的、未被使用的表达式,自然不会影响total的值。
内容的提问来源于stack exchange,提问作者Jason Chown
相关产品推荐
相关产品推荐

