优秀的编程知识分享平台

网站首页 > 技术文章 正文

纳尼?为了让你用val,Scala连if的语法都改了

nanyue 2024-08-15 07:57:26 技术文章 5 ℃

在之前的文章《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")。

这块的具体好处,先埋一个坑,后面慢慢填吧~

Tags:

最近发表
标签列表