
2.7 更多的表达式,更少的语句
像Java、C#和JavaScript这样的语言有比表达式更多的语句——if语句、for语句、try等。而像Ruby、F#、Groovy、Haskell和许多其他语言则表达式多于语句。在讨论Kotlin的偏好之前,让我们先讨论哪个更好。
虽然语句很普遍,但它们有不好的一面——它们不返回任何东西,并且有副作用。副作用是状态的改变:改变变量、写入文件、更新数据库、将数据发送到远程Web服务、损坏硬盘……表达式更好些——它们返回一个结果,不需要修改任何状态就可以发挥作用。
让我们看一个例子来看看其中的区别。让我们编写一段Kotlin代码,就像在Java和C#语言中所做的那样:


canVote()方法像使用语句一样使用if。由于语句不返回任何东西,因此可以从中得到任何用于进一步处理的有用结果的唯一方法是设置一个可变变量并在分支中修改其值。
然而,在Kotlin中,if是一个表达式。我们可以使用if的调用结果做进一步的处理。让我们重写之前的代码,使用if作为表达式而不是语句:

可以使用val而不是var,因为我们不会改变一个变量。我们能够对status使用类型推断,因为该值可以从if表达式中知晓。代码既不混乱,也不容易出错。
Kotlin也把try-catch视为一个表达式。如果没有异常,则try部分中的最后一个表达式将成为结果。否则,catch中的最后一条语句将成为结果。
这里有一个try-catch-finally用作表达式的例子。

不过,有一个惊喜。Java将赋值看作表达式,而Kotlin不是这样。如果使用var分别将变量a、b、c定义为一些整数值,如1、2和3,以下代码将会在Kotlin中编译失败:

之所以不将=视为表达式,原因之一是Kotlin允许使用委托的变量拦截get和set,我们将在本书后面看到这一点。如果=被视为一个表达式,那么赋值链可能会导致意想不到的复杂行为,这些行为可能会令人困惑,并成为错误的来源。