我是Scala的新手,我想知道为什么main方法没有在这个脚本中运行?
class Word {
}
object HelloWorld {
def main(args: Array[String]) {
println("Hello, world!")
}
}
有趣的是,当我删除Word
类时,它工作正常。为什么是这样?我该如何解决?
答案 0 :(得分:9)
如getting started with scala所示,在将scala文件作为脚本运行时,应该显式调用main方法:
class Word {
}
object HelloWorld {
def main(args: Array[String]) {
println("Hello, world!")
}
}
HelloWorld.main(args)
如果要编译并运行,则必须提供包含main
方法的对象的名称:
scalac test.scala
scala HelloWorld
答案 1 :(得分:9)
这种奇怪行为的原因很简单。当运行scala
可执行文件并在命令行上传递脚本名称时(如scala hello.scala
中所示),默认情况下会发生的事情是它会“猜测”运行的内容。如果文件仅包含具有合适main
方法的单个对象(意味着它也是正确的程序入口点),则运行main
方法。否则,scala文件将被解释为正确的脚本(在顶层接受语句并逐行运行,就像在交互模式下一样)。
因此,有两种使用scala解释器可执行文件运行scala文件的方法(第一种方法很少使用)。
因此,只要您将另一个类添加到源文件中,第一个执行模式(调用main方法)就不会再触发,您又回到标准的逐行解释。因此,除非您明确地调用它,否则不再调用main方法。
作为参考,这里是scala -help
(强调我的)的输出:
用法:scala< options>并[d脚本|类|对象|罐子> <参数>] 或者scala -help
还允许使用scalac的所有选项(请参阅scalac -help)。 除scala指定选项之外的第一个给定参数 该怎么办可运行的目标是:
- 包含scala源的文件
- 已编译类的名称
- 具有有效Main-Class属性的可运行jar文件
- 或者如果没有给出参数,则启动repl(交互式shell)
scala到达java运行时的选项:
-Dname = prop直接传递给java来设置系统属性
-J -J被剥离并按原样传递给java -nobootcp不要将scala jar放在引导类路径上(较慢)其他启动选项:
-howtorun运行什么(默认:猜测)
-i在启动repl之前预加载
-e执行就像在repl中输入一样 -save将编译后的脚本保存在jar中以备将来使用
-nc no compilation daemon:不要使用fsc offline编译器文件参数将作为scala脚本运行,除非它仅包含 自包含的编译单元(类和对象)和一个 可运行的主要方法。在这种情况下,文件将被编译和 调用main方法。这提供了脚本和标准之间的桥梁 scala来源。
插件'延续'的选项:
-P:continuations:enable启用continuation
答案 2 :(得分:5)
实际上你写的不是Scala脚本,而是一个简单的Scala程序。 Scala脚本在组织和运行方式上与简单程序不同,没有编译阶段,Scala编译器会逐行解释源文件,就像在REPL会话中一样。
要从您的文件制作Scala脚本,请离开:
println("This is a scala script")
并将其保存在*.scala
文件中,然后在终端窗口中使用scala
命令运行它,而不进行任何先前的scalac
调用。 Scala编译器将自动确定这是一个脚本,因为源文件以表达式结束。当您将HelloWorld.main(args)
放在文件的末尾时,它将作为脚本文件执行,但使用main()
方法的类和伴随对象已完全过时
答案 3 :(得分:0)
如果您使用的是Unix,可以将Scala脚本作为shell脚本运行 通过在文件顶部添加 pound bang 指令。
例如,在名为helloarg
的文件中键入以下内容:
#!/bin/sh
exec scala "$0" "$@"
!#
// Say hello to the first argument
println("Hello, "+ args(0) +"!")
初始#!/bin/sh
必须是文件中的第一行
设置执行权限后:
$ chmod +x helloarg
您可以通过简单地说:
将Scala脚本作为shell脚本运行$ ./helloarg globe
如果您使用的是Windows,则可以通过命名来实现相同的效果
文件helloarg.bat
并将其放在脚本的顶部:
::#!
@echo off
call scala % 0 % *
goto :eof
::!#