如何从命令行运行Scala文件?

4
Scala是否支持“scala run xxx.scala”?Go语言支持像这样运行:
go my.go

Python 支持

python my.py

但是看起来

scala xxx.scala

仅进行语法检查,没有输出或运行行为。那么有没有一种直接运行Scala文件的方法?


请看这个链接:https://dev59.com/RWct5IYBdhLWcg3wCZIT - jacks
1
值得注意的是,一些旧信息已经过时,比如令人困惑的“-nc”内容。 - som-snytt
4个回答

3

Scala运行器的目标可以通过-howtorun参数显式指定。

If the runner does not correctly guess how to run the target:

 -howtorun    what to run <script|object|jar|guess> (default: guess)

例如,假设我们有一个fat jar文件,那么我们可以使用以下命令运行它:
scala -howtorun:jar myapp.jar

默认情况下,scala 运行器会尝试猜测并以以下方式运行指定的目标:

  • 具有 main 方法的已编译类
  • 带有 Main-Class 属性的 jar 文件
  • 需要编译和运行的 Scala 源文件

例如,给定以下 Hello.scala 源文件:

// source file Hello.scala
object Hello {
  def main(args: Array[String]): Unit = {
    println("Hello World!")
  }
}

如果执行 scala Hello.scala,则应按照上文第三个项目的要求输出 Hello World!

同时请参阅 Scala 的首行代码


我必须先运行 scalac Hello.scala,然后再运行 scala Hello 才能得到输出(即编译源代码)。在你的情况下,源代码是如何编译的? - mjkrause

2

看起来很简单。但是你需要使用println打印一些内容。

➜  ~ cat hello.scala
println("hello, world")
➜  ~ scala hello.scala
hello, world
➜  ~ scala -Vprint:parser hello.scala
[[syntax trees at end of                    parser]] // hello.scala
package <empty> {
  object Main extends scala.AnyRef {
    def <init>() = {
      super.<init>();
      ()
    };
    def main(args: Array[String]): scala.Unit = {
      final class $anon extends scala.AnyRef {
        def <init>() = {
          super.<init>();
          ()
        };
        println("hello, world")
      };
      new $anon()
    }
  }
}

hello, world
➜  ~ 

或者有几种方法向REPL输入代码行,它会为您打印结果。

➜  ~ cat calc.scala
2 + 2
➜  ~ scala < calc.scala
Welcome to Scala 2.13.1 (OpenJDK 64-Bit Server VM, Java 11.0.3).
Type in expressions for evaluation. Or try :help.

scala> 2 + 2
res0: Int = 4

scala> :quit
➜  ~ 

另外还有-i-I-e:load:paste命令可供参考。

正如其他答案所示,它也会在对象中查找类似Java风格的主方法。这就是通常编译程序入口的方式。


1
我强烈推荐使用 ammoninte 处理此类情况。它是一种独立工具,但功能更加丰富且运行良好。
更多信息请参见http://ammonite.io/

0
在运行 Scala 源代码之前,您需要使用 scalac filename.scala 命令编译 Scala 代码。 要执行已编译的 Scala 文件,您需要键入以下命令:scala filename

1
虽然这是正确的,但有一个标志可以将所有内容传递给解释器。你还可以使用神奇的 #! /usr/bin/env scala 在脚本开头编写 Scala 脚本。 - Luis Miguel Mejía Suárez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接