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