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中使用的自定义方法。