- Scala编程(第5版)
- (德)马丁·奥德斯基等
- 924字
- 2022-05-06 15:51:38
4.5 Scala应用程序
要运行一个Scala程序,必须提供一个独立对象的名称,而这个独立对象需要包含一个main方法,该方法接收一个Array[String]作为参数,结果类型为Unit。任何带有满足正确签名的main方法的独立对象都能被用作应用程序的入口。[8]参考示例4.3。
示例4.3 Summer应用程序
示例4.3中单例对象的名称是Summer。它的main方法带有正确的签名,因此可以将它当作应用程序来使用。文件中的第一条语句引入了示例4.2的ChecksumAccumulator对象中定义的calculate方法。这句引入语句让你可以在这个文件后续的代码中使用这个方法的简称。[9]main方法的方法体只是简单地打印出每个参数,以及参数的校验和,并以冒号分隔开。
注意
Scala在每一个Scala源码文件中都隐式地引入了java.lang和scala包的成员,以及名称为Predef的单例对象的所有成员。位于scala包的Predef包含了很多有用的方法。比如,当你在Scala源码中使用println时,实际上调用了Predef的println。(Predef.println转而调用Console.println,执行具体的操作。)而当你写下assert时,实际上调用了Predef.assert。
要运行Summer这个应用程序,可以把示例4.3中的代码放入名称为Summer.scala的文件中。因为Summer也用到了ChecksumAccumulator,将示例4.1中的类和示例4.2中的伴生对象放入名称为ChecksumAccumulator. scala的文件中。
Scala和Java的区别之一是,Java要求将公共的类放入与类同名的文件中(例如,需要将SpeedRacer类放到SpeedRacer.java文件中),而Scala允许任意命名.scala文件,无论你将什么类或代码放到这个文件中。不过,通常对于那些非脚本的场景,把类放入以类名命名的文件中是推荐的做法,就像Java那样,以便程序员能够更容易地根据类名定位到对应的文件。这也是我们在命名Summer.scala和ChecksumAccumulator.scala时所采取的策略。
ChecksumAccumulator.scala和Summer.scala都不是脚本,因为它们都是以定义结尾的。而脚本则不同,必须以一个可以计算出结果的表达式结尾。因此,如果你尝试以脚本的方式运行Summer.scala,则编译器会报错,提示你Summer.scala并不以一个结果表达式结尾(当然,这是假设你并没有在Summer对象定义之后自己再添加任何额外的表达式)。你需要用Scala编译器实际编译这些文件,然后运行编译出来的类。编译的方式之一是,使用scalac这个基础的Scala编译器,就像这样:
这将编译你的源文件,并生成Java类文件,后续可以通过与先前示例中相同的scala命令来运行该文件。不过,与之前用包含了需要编译器解释的Scala代码的以.scala扩展名结尾的文件名不同,[10]这里需要给出包含正确签名的main方法的独立对象名。因此,需要这样运行Summer:
你将看到这个程序打印出了传入的两个命令行参数对应的校验和: