【问题标题】:How to import package into Scala REPL?如何将包导入 Scala REPL?
【发布时间】:2018-06-01 03:58:56
【问题描述】:

如何将包导入 Scala 的 REPL? 我正在尝试导入这个名为 funsets 的包,它有一个名为“FunSets”的对象。 我尝试了import funsets._import funsets._; 等的几种变体,但它仍然没有导入包中的函数和对象。

【问题讨论】:

  • 什么是功能集?它在罐子里吗?它是一个编译的类文件吗?它是一个scala文件吗?它是像 maven Central 这样的外部存储库中的托管依赖项吗?
  • funsets 是包的名称,其中包含一个名为 FunSets 的对象。它只是在一个 scala 目标文件中。
  • 你需要在 sbt shell 中运行console。然后,sbt 将编译 funsets 中定义的任何内容,并自动将其添加到您的 Scala shell 中。从那里,您将能够执行import funsets._

标签: scala sbt read-eval-print-loop


【解决方案1】:

一种方法是编译“scala 类”并将其放入classpath

例子,

1) 假设你有一个班级funsets.FunSets.scala

package funsets                                                                                        

object FunSets {                                                                                       

  def fun = "very fun"                                                                                 

}      

2) 首先使用scalac 编译类。(如果你使用sbt 那么sbt compile 会将编译后的类放在target/ 文件夹中)

scalac FunSets.scala

您将看到创建的funsets 文件夹/包,

$ ls -l
total 16
-rw-r--r--  1 updupd  NA\Domain Users   63 Dec 18 11:05 FunSets.scala
drwxr-xr-x  4 updupd  NA\Domain Users  136 Dec 18 11:06 funsets

3) 然后在类路径中使用funsets 包启动REPL

$ scala -classpath .
Welcome to Scala 2.12.3 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_151).
Type in expressions for evaluation. Or try :help.

scala> import funsets._
import funsets._

注意:如果您使用sbt compile,请将target/classes 放在类路径中。

访问 Funsets 单例,

scala> FunSets.fun
res0: String = very fun

另请阅读Scala REPL unable to import packge

【讨论】:

    【解决方案2】:

    您还需要在启动 repl 时使用 -cp <jar files> 参数将适当的 jar 添加到类路径中。或者,您可以在启动会话后使用 repl 中的 :require <jar file> 指令加载 jar。

    【讨论】:

      【解决方案3】:

      假设您在 scala 文件中有一些代码,您可以使用 :load 命令从 scala repl 加载外部 scala 文件。更多信息in this answer

      【讨论】:

      • 在 REPL 中,我尝试了 :load "C:...full file path name 和一大堆变体。我什至尝试过 `:paste "full file path name" 但它一直说像 "usage: :load -v file" 或 "usage: :paste -raw file"
      • 如果您在与文件相同的目录中启动 repl,您应该能够执行:load myFile.scala
      • 根据this answer,您可能必须在Windows 中使用:lo 命令而不是:load,即使它应该具有相同的行为。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-14
      • 1970-01-01
      • 1970-01-01
      • 2022-11-21
      • 2012-05-18
      相关资源
      最近更新 更多