我已经安装了 Scala(在一台气隙 Linux 机器上,来自 scala3-3.3.1.tar.gz)。
我尝试在没有
sbt
的情况下运行一个简单的 Scala 程序。所以我写了一个文件hello.scala
object Hello {
def main(args: Array[String]) = {
println("Hello, World")
}
}
然后调用
scala hello.scala
这有效。 :-)
但是我浏览了 Scala 3 网站,看到了许多没有整个“对象包装”的代码示例。所以我希望写一个更简单的文件
script.scala
println("Hello, World")
并使用
scala
运行它。但这不起作用:Scala 返回错误“顶级定义的非法开始”。
我该如何运行它?我需要一些命令行选项吗?还是我需要
scala-cli
? (我已读到scala
已经成为或将成为scala-cli
。)
我很困惑。在气隙机器上运行简单 Scala 脚本的最佳方法是什么?
Scala 3 不支持脚本模式。有一个开放的 Scala 改进流程 (SIP) 问题,涉及 重新添加旧 Scala 2
scala
运行程序的一些功能。
实现这一点的方法是合并 Scala CLI 中的一些代码,其中包括脚本运行器(以及许多其他东西)。
好消息是:您不必等待 SIP-42 实施,因为 Scala CLI 已经存在并且可以工作了现在。 Scala CLI 脚本具有许多旧脚本运行程序所没有的功能,例如加载附加代码或通过
//> using
指令指定特定的 Scala 版本。
请注意,如果我没有记错的话,您显示的代码是never合法的Scala代码。它是 Scala 的一个特殊的子变体,它仅被集成到
scala
命令中的脚本运行器接受。这可能看起来像是一个技术问题,但这就是为什么在 Scala 语言中没有将其记录为不兼容的原因:它从来都不是 Scala 语言的一部分。
如果您不想使用 Scala 2 或 Scala CLI,Scala 3 极大地改进了编写主要方法的语法,因此该示例并不像您问题中的示例那么冗长。在 Scala 3 中,您的代码将如下所示:
@main def main = println("Hello, World")
请注意,方法的名称可以是任何名称,因此如果您想让它更短:
@main def _ = println("Hello, World")
Main 方法有一些很酷的功能,例如,只需定义参数即可免费获得命令行参数解析:
@main def add(a: Int, b: Int) = println(a + b)
scala add 3 4
# 7
scala add 3 four
# Illegal command line: java.lang.NumberFormatException: For input string: "four"
Scala 将获取参数的名称和类型,并为您生成命令行参数解析代码,包括错误处理和报告。