如何使用 Scala 运行简单的脚本?

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 脚本的最佳方法是什么?

Jör*_*tag 5

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 将获取参数的名称和类型,并为您生成命令行参数解析代码,包括错误处理和报告。