在Scala脚本中不调用main方法

时间:2013-06-07 17:56:01

标签: scala

我是Scala的新手,我想知道为什么main方法没有在这个脚本中运行?

class Word {
}

object HelloWorld {
  def main(args: Array[String]) {
    println("Hello, world!")
  }
}

有趣的是,当我删除Word类时,它工作正常。为什么是这样?我该如何解决?

4 个答案:

答案 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
::!#