scala 脚本和 scala 应用程序有什么区别?请提供一个例子
我正在阅读的书说脚本必须始终以结果表达式结尾,而应用程序以定义结尾。不幸的是,没有给出明确的例子。
请帮我澄清一下
scala 脚本和 scala 应用程序有什么区别?请提供一个例子
我正在阅读的书说脚本必须始终以结果表达式结尾,而应用程序以定义结尾。不幸的是,没有给出明确的例子。
请帮我澄清一下
我认为作者的意思是一个常规的 scala 文件需要定义一个类或一个对象才能工作/有用,你不能使用顶级表达式(因为编译文件的入口点是 pre -定义)。例如:
println("foo")
object Bar {
// Some code
}
该println
语句在文件的顶层是无效的.scala
,因为唯一的逻辑解释是在编译时运行它,这实际上没有意义。
相比之下,Scala 脚本可以在顶层包含表达式,因为这些是在脚本运行时执行的,这又是有意义的。另一方面,如果 Scala 脚本文件只包含定义,那么它也是无用的,因为脚本不知道如何处理这些定义。但是,如果您以某种方式使用定义,那又可以了,例如:
object Foo {
def bar = "test"
}
println(Foo.bar)
后者作为 scala 脚本是有效的,因为最后一条语句是使用前一个定义的表达式,而不是定义本身。
脚本的特点:
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")
}
}
好吧,我一直认为这是一个 Scala 脚本:
$ cat script
#!/usr/bin/scala
!#
println("Hello, World!")
运行简单:
$ ./script
另一方面,应用程序必须.class
使用运行时显式编译和执行java
。