1.4 scalac和scala命令

问题

虽然你通常会使用像sbt或Mill这样的工具来构建Scala应用程序,但偶尔你可能会想使用更基础的工具来编译和运行小型测试程序,就像你可能会使用javac和java来处理小型Java应用程序一样。

解决方案

用scalac编译小程序,然后用scala运行它们。例如,有以下名为Hello.scala的Scala源码文件:

使用scalac在命令行中编译:

然后用scala运行它,给scala命令传递一个用@main标记的方法名:

讨论

在Scala中,编译和运行类(包括像classpath这样的概念)与Java是一样的。例如,假设有一个名为Pizza.scala的文件中有一个Pizza类,并且它依赖一个Topping类型:

假设Topping的定义是这样的:

它在名为Topping.scala的文件中,并且已经在一个名为classes的子目录中被编译成了Topping.class,可以这样编译Pizza.scala

注意,scalac命令有很多额外的选项可以使用。例如,如果你在前面的命令中加上-verbose选项,你会看到数百行额外用来显示scalac是如何工作的输出行。这些选项可能会随着时间的推移而改变,所以可以使用-help选项来查看额外的信息:

main方法

在我们谈论编译main方法的时候,需要了解Scala 3可以用两种方式来声明main方法:

·在一个方法上使用@main注解。

·在一个object中声明一个签名正确的main方法。

如上所述,一个简单的无参@main方法可以这样声明:

也可以声明一个@main方法来接收命令行传入的参数,比如在这个例子中接收一个String和一个Int类型的参数:

在使用scalac编译这段代码后,可以这样来运行:

对于第二种方法,在object内部声明main方法就像在Java中声明main方法一样,而Scala中的main方法的签名必须是这样的:

这段Scala代码与下面的Java代码类似: