这个问题可能听起来有点愚蠢,但我无法弄清楚,如何从命令行启动Scala方法.
我编译了以下文件Test.scala:
package example
object Test {
def print() {
println("Hello World")
}
Run Code Online (Sandbox Code Playgroud)
}
与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
Run Code Online (Sandbox Code Playgroud)
但我真正想做的是,使用一个命令直接从命令行运行该方法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
Run Code Online (Sandbox Code Playgroud)
哪里
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
Run Code Online (Sandbox Code Playgroud)
更新2 - 可能的解决方案:
scala -e "import example.Test._; print"与Windows 7 配合得很好.Dan*_*ral 10
让我稍微扩展一下这个解决方案:
scala -e 'example.Test.print'
Run Code Online (Sandbox Code Playgroud)
相反,尝试:
scala -cp path-to-the-target-directory -e 'example.Test.print'
Run Code Online (Sandbox Code Playgroud)
目标目录是scala用作其编译目标的目标的目录.在你的例子中,它不是 C:\Users\John\Scala\Examples\example,但是C:\Users\John\Scala\Examples.该目录example是Scala将查找属于该包的 类的位置example.
这就是为什么事情不起作用的原因:它希望example在目录示例下找到包,但是在你运行的当前目录下没有这样的目录,并且当前目录中scala存在的类文件应该在默认包.
执行此操作的最佳方法是扩展App,这是一个稍微特殊的类(或者至少是其下的DelayedInit):
package example
object Test extends App {
println("Hello World")
}
Run Code Online (Sandbox Code Playgroud)
它仍然可以为此添加方法,对象的主体在启动时执行.