11

这个问题可能听起来有点愚蠢,但我不知道如何从命令行启动 Scala 方法。

我编译了以下文件Test.scala

package example

object Test {
  def print() {
    println("Hello World")
  }

}

scalac Test.scala.

然后,我可以分两步print运行该方法:scala

C:\Users\John\Scala\Examples>scala
Welcome to Scala version 2.9.2 (Java HotSpot(TM) Client VM, Java 1.6.0_32).
Type in expressions to have them evaluated.
Type :help for more information.

scala> example.Test.print
Hello World

但我真正喜欢做的是,直接从命令行使用一个命令运行该方法,例如scala example.Test.print.

我怎样才能实现这个目标?

更新: ArikG 建议的解决方案对我不起作用 - 我错过了什么?

C:\Users\John\Scala\Examples>scala -e 'example.Test.print'
C:\Users\John\AppData\Local\Temp\scalacmd1874056752498579477.scala:1: error: u
nclosed character literal
'example.Test.print'
         ^
one error found

C:\Users\John\Scala\Examples>scala -e "example.Test.print"
C:\Users\John\AppData\Local\Temp\scalacmd1889443681948722298.scala:1: error: o
bject Test in package example cannot be accessed in package example
example.Test.print
        ^
one error found

在哪里

C:\Users\John\Scala\Examples>dir example
 Volume in drive C has no label.
 Volume Serial Number is 4C49-8C7F 

 Directory of C:\Users\John\Scala\Examples\example

14.08.2012  12:14    <DIR>          .
14.08.2012  12:14    <DIR>          ..
14.08.2012  12:14               493 Test$.class
14.08.2012  12:14               530 Test.class
               2 File(s)          1.023 bytes
               2 Dir(s)  107.935.760.384 bytes free

更新 2 - 可能的解决方案:

  • 正如 ArikG 正确建议的那样,withscala -e "import example.Test._; print"适用于 Windows 7。
  • 请参阅 Daniel 的答案以使其在没有导入语句的情况下工作
4

3 回答 3

10

让我稍微扩展一下这个解决方案:

scala -e 'example.Test.print'

相反,请尝试:

scala -cp path-to-the-target-directory -e 'example.Test.print'

目标目录是 scala 用作编译目标的目录。在您的示例中,它不是 C:\Users\John\Scala\Examples\example,而是C:\Users\John\Scala\Examples。该目录example是 Scala 将在其中查找属于该 example的类的位置。

这就是为什么事情不起作用的原因:它希望example在目录 example 下找到包,但是在您运行的当前目录下没有这样的目录,并且当前目录中scala存在的类文件应该在默认包。

于 2012-08-14T17:30:56.847 回答
6

最好的方法是扩展App,它是一个稍微特殊的类(或者至少是它的基础的 DelayedInit ):

package example

object Test extends App {
  println("Hello World")      
}

仍然可以为此添加方法,对象的主体在启动时执行。

于 2012-08-14T09:54:51.220 回答
4

干得好:

scala -e 'example.Test.print'
于 2012-08-14T09:57:48.000 回答