9

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

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

请帮我澄清一下

4

3 回答 3

6

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

println("foo")

object Bar {
    // Some code
}

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

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

object Foo {
    def bar = "test"
}

println(Foo.bar)

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

于 2012-12-02T22:50:18.050 回答
5

比较

脚本的特点:

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

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

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

例子

如果您编写以下脚本:

#!/usr/bin/env scala

println("foo")

Scala 2.11.1 编译器会假装(github 上的源代码)你写过:

object Main {
  def main(args: Array[String]): Unit =
    new AnyRef {
      println("foo")
    }
}
于 2014-06-27T09:18:07.240 回答
0

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

$ cat script

#!/usr/bin/scala
!#

println("Hello, World!")

运行简单:

$ ./script

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

于 2012-12-02T22:04:25.377 回答