1.2 在REPL中使用源代码和JAR文件

问题

你想在REPL中使用源文件中的Scala代码。

解决方案

使用:load命令可以将源代码文件加载到REPL环境中。例如,在一个名为models的子目录里有一个名为Person.scala的文件,里面的代码如下:

你可以像下面这样将代码加载到REPL环境中:

在代码被加载到REPL后,可以创建一个新的Person实例:

注意,如果你的代码中有package声明:

源代码文件不能在REPL环境中使用包,对于这种情况,需要将其编译成JAR文件,然后放到REPL所启动的工程的classpath里。例如,我是这样在REPL中使用0.2.0版本的Simple Test库(https://oreil.ly/LcxCG)的:

在撰写本书时,Scala还不能将JAR添加到已运行的REPL会话中,但将来可能会加入这个功能。

讨论

最好熟悉一下另外一个知识点:REPL会自动加载当前目录下已经编译好的class文件。比如,如果你将下面的代码放在一个名为Cat.scala的文件中,并使用scalac进行编译,编译器会创建一个Cat.class文件:

如果在这个class文件所在的目录下启动REPL,就可以直接创建一个新的Cat:

可以使用这种技术在UNIX系统下自定义REPL环境。而要做到这一点,需要参照以下步骤:

·在主目录下创建一个名称为repl的文件夹。比如,我在计算机上创建的目录是/User/al/repl(你也可以用自己喜欢的名字来命名)。

·把任何你想要的*.class文件放到该目录下。

·创建一个用来启动该目录下REPL的alias或者shell脚本。

在我的系统中,将Repl.scala放在了~/repl中,它的代码如下:

然后我使用scalac编译该代码,于是编译器在这个目录下创建了class文件。接下来用下面的方式创建并使用alias来启动REPL:

这个alias将当前工作目录设置成~/repl,然后启动REPL,最后在退出REPL时返回之前工作的目录。

另一种方法是创建一个名为repl的脚本并使其可执行,然后放到~/bin目录里(或者PATH里包含的其他地方):

因为shell脚本是在一个子进程中运行的,所以当你退出REPL时,会被返回到原来的目录。

通过使用这种方法,当REPL启动时,自定义方法将被加载,所以你可以在scala shell中使用它们:

可以使用这种方法来预加载其他任何你想要在REPL中使用的自定义方法。