0%

Kotlin禁止将赋值操作用于while或if语句

在Kotlin中,赋值操作不能用于while或者if语句中,这与Java或者C/C++的用法明显不同。

在《Learn Android Studio3 with Kotlin》一书中是这么解释的:

Assignments are expressions in Java, but they are statements in Kotlin.

用我们的话来说就是,在Kotlin语言中赋值操作是语句而非表达式

那statement和expression有什么区别呢?简单来说,expression最终总是被解析为一个值,而statement就是语句,它不能解析为一个值。既然不能解析为值,就无法对statement判断真假,赋值操作也就不能用于while或if中了。

Kotlin将赋值当作statement的原因我还未细看,但此种规则确实可以带来一些好处,通过一个简单对比例子就能明白了。

An Example

赋值操作用于if语句,带来极其隐晦的Bug

在Java或者C++中,比较两个变量的值是否相等是家常便饭,但是你也许不经意间就会犯下面的错误,在程序中埋下一颗地雷,破坏力巨大但又极其难以发现。

比方说,你本意是想比较变量barfoo的值是否相等,但是你手一抖,写成了下面的样子:

1
2
3
if (bar = foo) { //其实你想写的是 if (bar == foo)
// bla...bla...
}

在C++中bar=foo返回值就是赋值后bar的值,所以编译不会报错(会有Warning,但有多少人会理会?),代码走查一眼也看不出来错误。然后就上线运行了,突然有一天就爆炸了,你费了九牛二虎之力才发现这个愚蠢的错误,连说了N句**……

Kotlin不能将赋值操作用于if

相反地,如果你在Kotlin中不小心这么写了:

1
2
3
if (bar = foo) { //还是手抖少写了一个 ‘=’ 号
// bla.. bla..
}

编译器很冷漠并朝你抛出一个鄙视的眼神:

1
Error: Kotlin: Assignments are not expressions, and only expressions are allowed in this context

如此一来,这种低级不经意的错误就被扼杀在摇篮里了。

小结

Kotlin将Assignment当作statement而不是expression,并且禁止Assignment用在while/if等语句中,可以帮助程序员防止低级愚蠢的错误,在编码阶段阻断Bug。