scala脚本和应用程序之间的区别

时间:2012-12-02 21:57:14

标签: scala

scala脚本和scala应用程序有什么区别?请提供一个例子

我正在阅读的书中说,脚本必须始终以结果表达式结束,而应用程序以定义结束。不幸的是,没有显示明确的例子。

请帮我澄清一下

3 个答案:

答案 0 :(得分:6)

我认为作者的意思是,常规的scala文件需要定义一个类或一个对象才能工作/有用,你不能使用顶级表达式(因为编译的入口点)文件是预先定义的)。例如:

println("foo")

object Bar {
    // Some code
}

println语句在.scala文件的顶层无效,因为唯一的逻辑解释是在编译时运行它,这实际上没有用。

相比之下,Scala脚本可以在顶层包含表达式,因为这些脚本在脚本运行时执行,这是有意义的。另一方面,如果Scala脚本文件仅包含定义,那么它也将是无用的,因为脚本不知道如何处理定义。但是,如果你以某种方式使用这些定义,那就再好了,例如:

object Foo {
    def bar = "test"
}

println(Foo.bar)

后者作为scala脚本有效,因为最后一个语句是使用前一个定义的表达式,而不是定义本身。

答案 1 :(得分:5)

比较

脚本的功能:

  • 与应用程序一样,脚本在运行之前编译。实际上,编译器在编译之前将脚本转换为应用程序,如下所示。
  • 无需自己运行编译器 - 当您运行脚本时,scala会为您执行此操作。
  • 感觉与bash,python或ruby等脚本语言非常相似 - 您可以直接看到编辑结果,并获得非常快速的调试周期。
  • 您不需要提供main方法,因为编译器会为您添加一个。

Scala脚本对于可在单个文件中实现的较小任务有用。

另一方面,

Scala应用程序在您的项目开始变得更加复杂时更适合。它们允许将任务拆分为不同的文件和命名空间,这对于保持清晰度非常重要。

实施例

如果您编写以下脚本:

#!/usr/bin/env scala

println("foo")

Scala 2.11.1编译器会伪装(source on github)你写的:

object Main {
  def main(args: Array[String]): Unit =
    new AnyRef {
      println("foo")
    }
}

答案 2 :(得分:0)

好吧,我一直认为这是一个Scala脚本:

$ cat script

#!/usr/bin/scala
!#

println("Hello, World!")

用简单的方式运行:

$ ./script

另一方面,应用程序必须编译为.class并使用java运行时显式执行。