当系统同时安装了 Scala2 和 Scala3 时,如何执行 Scala3 脚本?

问题描述

我想使用 Scala3 执行以下脚本:

@main def m() =
  println("Hello,world! I'm a script")

当我输入命令 scala hello.scala 时,出现以下错误

/Users/avirals/dev/learning-scala/hello-world/hello.scala:1: error: not found: type main
@main def m() =
 ^
one error found

我认为这是因为我安装了两个版本的 Scala(2 和 3)。我知道如何为两者启动 REPL(如 here 所述),但我无法从命令行执行 Scala3 脚本。

[更新]

我尝试了 scala3-repl hello.scala,它只是打开了 REPL:

➜  learning-scala git:(main) scala3-repl hello.scala
scala> m()
1 |m()
  |^
  |Not found: m

如果我安装了两个不同版本(2 和 3)的 Scala,如何从命令行执行 Scala 3 脚本?

我的操作系统:MacOS

更新 2

正如 this 回答中所建议的,我尝试使用 amm 运行并且它适用于一些脚本。但是,以下脚本失败了:

脚本:

@main def m(args: String*) =
  var i = 0
  while i < args.length do
    println(args(i))
    i += 1

错误

➜  learning-scala git:(main) amm printargs.scala
printargs.scala:2:3 expected (If | While | Try | DoWhile | For | Throw | Return | ImplicitLambda | SmallerExprOrLambda)
  var i = 0
  ^

在 Scala3-REPL 中运行上述脚本是可行的:

➜  learning-scala git:(main) scala3-repl
scala> @main def m(args: String*) =
     |   var i = 0
     |   while i < args.length do
     |     println(args(i))
     |     i += 1
     |
def m(args: String*): Unit

scala> m("aviral","srivastava")
aviral
srivastava

在仅安装了 Scala3 的系统 (MacOS) 中运行相同的脚本也能正常工作。

解决方法

当前存在Minimal scripting support #11379。我可以通过从 https://github.com/lampepfl/dotty/releases/download/3.0.0-RC3/scala3-3.0.0-RC3.zip 手动下载一个版本、解压缩并授予启动器可执行权限来使其工作

call_id

使用 ./scala3-3.0.0-RC3/bin/scala hello.scala Hello,world! I'm a script 启动器,您至少可以做到

scala3-repl