默认scala脚本以.sc为扩展名,scala源程序以.scala结尾

a.sc == 脚本 -> scala执行

a.scala == 源代码 -> scalac编译 -> scala执行

下面展示一个文件名为upper.scala的scala脚本

package top.cocobolo

object Upper{
    def main(args:Array[String]): Unit = {
        args.map(s => s.toUpperCase).foreach(println(_))
    }
}

命令行输入scalac upper.scala可对其编译,发现在./top/cocobolo下会生成Upper.class文件;编译之后可以执行scala -cp . top.cocobolo.Upper test来运行刚刚编译的.class字节码。整个过程如下:

➜  Scala git:(master) ✗ scalac upper.scala
➜  Scala git:(master) ✗ scala -cp . top.cocobolo.Upper test
TEST

最后用scalap逆向一下class文件

  cocobolo git:(master)  scalap Upper                       
package top.cocobolo
object Upper extends scala.AnyRef {
  def this() = { /* compiled code */ }
  def main(args: scala.Array[scala.Predef.String]): scala.Unit = { /* compiled code */ }
}

以上是将该文件作为源代码先编译再运行,如果想直接作为脚本运行:

➜  Scala git:(master) ✗ scala ./upper.scala test            
/Users/zhe.lin/Code/Codes/Scala/./upper.scala:1: error: illegal start of definition
package top.cocobolo
^
one error found

报这个错的原因是:

It looks like you’re trying to declare the package membership in a Scala script (run using the scala command) or in the REPL.Only files defining just classes and objects which are compiled with scalac may be defined as belonging to a package.When you run code in a script or a REPL session, behind the scenes it is actually compiled inside a method of an object, in which scope a package declaration wouldn’t be legal.

解决方案是将第一行的package top.cocobolo注释掉:

// package top.cocobolo

object Upper{
    def main(args:Array[String]): Unit = {
        args.map(s => s.toUpperCase).foreach(println(_))
    }

再运行:

➜  Scala git:(master) ✗ scala ./upper.scala test
TEST