在之前的文章《Java程序员如何写出更加函数式的代码?》中,我们说,写出更健壮的代码的方式之一就是不用var编程。 在《Programming in Scala》的第7章,作者通过一个例子对这句话做出了诠释。 这是一个刚从Java转Scala的新手的常规写法:var filename = "default.txt" if (!args.isEmpty) filename = args(0) 从功能上讲,当然是没有什么问题的。但是,更加专业的写法应该是下面这个样子的: val filename = if (!args.isEmpty) args(0) else "default.txt" 纳尼?if...else...还能直接返回一个结果?万物皆表达式 是的,没错,在学习Schame的时候就接受了这样一个理念:万物皆表达式。通常我们在Java中会把代码分成2类:一类是语句:比如System.out.println啊之类的,另一类则是表达式,比如1+2。 Scala的身体里流着一半函数式的血液,在函数式编程的世界观里:programs are viewed as computing a value, thus the components of a program should also compute values. 程序是用来计算以获得某个值的,因此,程序的"零部件"也应该是用于计算某些值的。 因此,Scala沿袭了这一套设定,基础的控制结构如:if、while、for、try、match等,均返回的是一个值。 通过这样的设定,我们可以直接把if...else...的结果返回给filename,因此,filename不再需要是一个var了。val的好处 这里再结合具体的例子强调一下val的好处。 首先,我们知道程序都是"写一次,读N次"。在可读性方面,val能让后来者明确的知道filename是个啥,比如一旦赋值完成,后面打一行日志,你再也不用纠结这个filename是不是被各种改来改去过(尤其是某个返回void的方法,里面一通set操作)。可以节省不少扒代码排查问题的时间。 第二个好处,是val更容易做到引用透明。也就是说,println(filaname),可以无缝的被替代为println(if (!args.isEmpty) args(0) else "default.txt")。 这块的具体好处,先埋一个坑,后面慢慢填吧