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

How to execute a Scala3 script when system has both Scala2 and Scala3 installed?

我想使用 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(如前所述 ),但我无法从命令行执行 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 脚本?

我的OS:MacOS

更新 2

按照 回答中的建议,我尝试了 运行 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. I was able to get it working by manually downloading a release from https://github.com/lampepfl/dotty/releases/download/3.0.0-RC3/scala3-3.0.0-RC3.zip,正在解压缩,并为启动器提供可执行权限

./scala3-3.0.0-RC3/bin/scala hello.scala
Hello, world! I'm a script

使用 scala3-repl 启动器你至少可以做到

$ scala3-repl
scala> :load hello.scala                                                                                                                                                                                      
def m(): Unit

scala> m()                                                                                                                                                                                                  
Hello, world! I'm a script