1.1 初识Scala REPL

问题

你想要开始使用Scala REPL并了解它的一些基本功能。

解决方案

如果你使用过Java、Python、Ruby和Haskell等语言的REPL环境,你会觉得Scala REPL很熟悉。你只需在操作系统的命令行中输入scala来启动REPL即可。当REPL启动时,你可能会看到一个初始信息,紧接着的是scala>提示符:

该提示表明你正在使用Scala REPL。在REPL环境中,你可以尝试各种不同的实验和表达式:

正如上述例子所示:

·输入命令后,REPL的输出显示了表达式的结果,包括数据的类型信息。

·如第三个例子所示,如果你没有指定变量名,REPL会创建自己的变量,变量名依次是res0、res1,以此类推。你可以直接使用这些变量名进行运算等操作:

无论是初学者和还是有经验的开发者,大家每天都会在REPL中编写代码,以便快速了解Scala的功能和他们自己的算法是如何工作的。

Tab补全

有一些简单的技巧可以让REPL的使用更加有效。一个技巧是使用Tab补全来查看一个对象上的可用方法。我们可以通过输入1,然后输入一个小数点,接着再按<Tab>键来看看Tab补全是如何工作的。REPL的响应是列出Int实例上的几十个可用方法:

你也可以通过输入方法名的开头部分,然后按<Tab>键来限制所显示的方法列表。比如,如果你想查看List上的所有方法,只需要输入List(1).,然后按<Tab>键,就会看到超过200个方法。但如果你只关心List上以to开头的方法,那么你可以输入List(1).to,然后按<Tab>键,输出结果就会减少到只剩下这些方法:

讨论

我使用REPL创建了许多小实验,这有助于理解Scala自动执行的一些类型转换。比如,当我刚开始使用Scala,在REPL中输入以下代码时,我不知道变量x的类型是什么:

在REPL中运行这样的测试很容易,然后可以在一个变量上调用getClass来查看其类型:

虽然对于刚开始使用Scala的人来说,上面这一行输出的可读性有些差,但是=右边的信息能让你知道这个类型是一个Tuple3类。

你也可以使用REPL的:type命令来查看类似的信息,但这样并不会显示Tuple3的名字:

不过,一般来说,在大部分情况下,这个命令还是有帮助的:

虽然这都是一些简单的例子,但你会发现,当处理更复杂的代码以及那些你不熟悉的库时,REPL是非常有帮助的。

在sbt内部启动REPL

你也可以从sbt shell中启动Scala REPL会话,如17.5节所述,只需要在一个sbt项目中启动sbt shell即可:

然后使用console或consoleQuick命令:

console命令会编译项目中的源文件,将其放到classpath中并启动REPL。而consoleQuick命令则会直接使用项目依赖在classpath上启动REPL(不会编译项目源代码)。consoleQuick适用于你的项目源代码不能被编译或者你只是想使用依赖库尝试一些测试代码的情况。

另见

如果你很喜欢REPL环境的思路,但又想尝试一些默认REPL以外的REPL,可以考虑下面一些免费的REPL:

·在1.3节中演示的Ammonite REPL,它比默认REPL有更多的功能。

·Scastie(https://scastie.org),一个基于Web的REPL,支持sbt选项并且可以添加外部库。

·ScalaFiddle(https://scalafiddle.io),另一个基于Web的REPL。

·IntelliJ IDEA和Visual Studio Code(VS Code),它们的IDE都有类似REPL的功能的worksheet(工作表)。