在Scala REPL中导入多个包

11

在Scala中,我经常需要导入多个包含隐式转换和其他实用工具的包,特别是在REPL上:

import scala.collection.JavaConversions._
import scala.collection.{mutable => mut}
import com.myapp.db._
import com.orm._
val con = connectDb(...)
...
我知道在Scala中没有导入多个包的方法(虽然包对象作用域可以有所帮助),但是从REPL中呢?有没有什么办法可以在不大量复制粘贴的情况下从REPL中导入多个包?我也尝试过使用:load,但是那里导入/创建的东西也没有被引入REPL的作用域中。我注意到:power命令确实会将东西导入作用域中。
更新::load实际上是有效的。

1
当使用:load时,您是什么意思说“但是在那里导入/创建的东西也不会被引入到REPL的范围内”?对于导入和对象,它似乎对我很好用... - huynhjl
你是对的 - 我错误地尝试了 mut.<TAB> 并认为缺少自动补全意味着没有导入任何内容。 - Yang
“TAB” 是一个递归缩写,代表“TABs Are Broken”。 - som-snytt
1个回答

12

我不确定是否有通用的解决方案,但在 SBT 中可以配置项目,使得控制台(REPL)在启动时运行一些初始命令。以下是来自示例 build.sbt 文件的摘录:

// set the initial commands when entering 'console' only
initialCommands in console := "import myproject._"

编辑:另一个参考是Scalala项目。他们有一个Scala程序,可以启动嵌入式REPL并填写必要的导入。使用方法请参见他们的快速入门指南


1
还要注意,您可以创建一个使用SBT调用具有特定配置的REPL的脚本。请参阅SBT 0.10的维基百科有关脚本的内容。 - Daniel C. Sobral
@Daniel Sweet!你知道是否可以使用SBT来启动非REPL应用程序吗? - Kipton Barros
1
你可以使用它来启动Scala脚本--在我提到的同一页上有一个示例,即xsbt wiki上的脚本页面。 - Daniel C. Sobral
initialCommands 对我来说并没有按照我在问题中指定的方式工作 - 这些行被执行了,但符号实际上并没有被引入到 REPL 作用域中。不过还是将您的答案标记为已接受,因为 :load 确实可以工作。 - Yang
@Yang,关键是你不要通过输入“scala”来启动REPL,而是要输入“sbt console”来启动REPL。然后,你就可以导入在build.sbt的依赖中指定的所有包。 - soMuchToLearnAndShare

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接