近来 Scala 语言受到挺大的关注,我这个后知后觉者也来尝一下鲜。现在主要是从《Scala 编程》(原书名为《Programming in Scala》,网上找一找就有得下载英文原版的)这本国内翻译仍不完整(但也已经够我探索的了)的 pdf 文档了解、学习一下关于 Scala 语言的细节。

一边看书一边尝试着验证一下书中所说的 Scala 语言细节特性方面的内容。就如同作者所说“尝试自己输入是一个强迫你的大脑思考每一行代码的方式。尝试各种各样的变化是让它们变得更有趣也是让你确信你已真正明白它们如何工作的方法。

1、用 val 关键字来定义一个不可变的变量,其效果如同 Java 中的 final 修饰的变量不可被重新赋值。例如,val msg = "hello everybody !" 相当于把字符串 "hello everybody !" 绑定到变量名 msg 当中,以后使用 msg 则对应将操作应用在 "hello everybody !" 字符串上。

但是,在《Programming in Scala》中的第 51 页的注释中说到“In the interpreter, however, you can de?ne a new val with a name that was already usedbefore. ”即在解释器中,我们可以使用已经存在的 val 变量名来重新定义另一个val 变量。如下图:

clip_p_w_picpath001

很明显,直接打开 %SCALA_HOME%\bin\scala.bat 启动交互式的解释器模式键入这些语句,是不会出错的,即可以将一个已存在的 val 变量名重新定义为另一个新的 val 变量,这样不属于重新赋值。但是,当我把这几个语句写在脚本文件 step03.scala 中,并在命令行提示符窗口进入到该文件目录下使用 scala 命令(我已经配置好了 Scala 环境变量)执行该脚本时,发现情况有所不同。

脚本文件内容如下图:

clip_p_w_picpath002

试图执行该脚本时控制台发出下面的错误提示:

clip_p_w_picpath004

看到这样的错误信息,很容易让我们觉得《Programming in Scala》中作者的注释有点儿模糊,我很奇怪为什么两种不同的执行情况下(相同的代码)会有不同的结果。其实,书中 51 页对此的注释中还提示说关于重新使用 val 变量名的细节将在 4.3 节中说明,那是关于变量作用范围的讲解。我稍微看了一下,然后把脚本文件修改如下,其实就是对后面两个语句加上一对大括号 { 。

clip_p_w_picpath005

再次执行该脚本,结果如下图:

clip_p_w_picpath006

其实,这样子的“试验”还是不能让我明白到底是怎样的具体情况,因为加上大括号之后不过就是跟我们平时使用其他语言编程时缩小了变量 msg 的作用域,并把较大作用域的 msg 给覆盖掉而已。只能读到相关的那一章才能明白作者的这一句注释是什么意思、在什么情况下使用。而且,注释中还有一句“In the interpreter”这个前提,这应该也是一个关注点所在。