执行Scala命令行工具

时间:2022-09-02 19:50:35

1.2.2  执行Scala命令行工具

如果你单独安装了Scala 命令行工具,会发现与Java 编译器javac 相似,Scala 编译器叫作scalac。我们会使用SBT 执行编译工作,而不会直接使用scalac。不过如果你曾运行过javac 命令,会发现scalac 语法也很直接。

在命令行窗口中运行-version 命令,便可查看到当前运行的scalac 版本以及命令行参数帮助信息。与之前一样,在$ 提示符后输入文本。之后生成的文本便是命令输出。
 

 
 
  1. $ scalac -version  
  2. Scala compiler version 2.11.2 -- Copyright 2002-2013, LAMP/EPFL  
  3. $ scalac -help  
  4. Usage: scalac <options> <source files> 
  5. where possible standard options include:  
  6. -Dproperty=value   Pass -Dproperty=value directly to the runtime system.  
  7. -J<flag>           Pass <flag> directly to the runtime system.  
  8. -P:<plugin>:<opt>  Pass an option to a plugin  
  9. ... 

与之类似,执行下列scala 命令也可以查看Scala 版本及命令参数帮助。
 

 
 
  1. $ scala -version  
  2. Scala code runner version 2.11.2 -- Copyright 2002-2013, LAMP/EPFL  
  3. $ scala -help  
  4. Usage: scala <options> [<script|class|object|jar> <arguments>]  
  5. or scala -help  
  6.  
  7. All options to scalac (see scalac -help) are also allowed.  
  8. ... 

有时我们会使用scala 来运行Scala"脚本"文件, 而java 命令行却没有提供类似的功能。下面将要执行的脚本来源于我们的示例代码:
 

 
 
  1. // src/main/scala/progscala2/introscala/upper1.sc c  
  2. lass Upper {  
  3. def upper(strings: String*): Seq[String] = {  
  4. strings.map((s:String) => s.toUpperCase())  
  5. }  
  6. }  
  7. val up = new Upper  
  8. println(up.upper("Hello", "World!")) 

我们将调用scala 命令执行该脚本。也请读者尝试运行该示例。上述代码使用的文件路径适用于Linux 和Mac OS X 系统。我假设,当前的工作目录位于代码示例所在的根目录。如果使用Windows 系统,请在路径中使用反斜杠。
 

 
 
  1. $ scala src/main/scala/progscala2/introscala/upper1.sc  
  2. ArrayBuffer(HELLO, WORLD!) 

现在我们终于满足了编程图书或向导的一条不成文的规定:第一个程序必须打印"Hello World!"。

最后提一下,执行scala 命令时,如果未指定主程序或脚本文件,那么scala 将进入REPL 模式,这与在sbt 中运行console 命令类似。(不过,运行scala 时的classpath 与执行console 任务的classpath 不同。)下面列出的REPL 会话中讲解了一些有用的命令。(如果你未独立安装Scala,在sbt 中执行console 任务也能进入Scala REPL 环境)。此时, REPL 提示符是scala>(此处省略了一些输出信息)。
 

 
 
  1. $ scala  
  2. Welcome to Scala version 2.11.2 (Java HotSpot(TM)...).  
  3. Type in expressions to have them evaluated.  
  4. Type :help for more information.  
  5.  
  6. scala> :help  
  7. All commands can be abbreviated, e.g. :he instead of :help.  
  8. :cp <path> add a jar or directory to the classpath  
  9. :edit <id>|<line> edit history  
  10. :help [command] print this summary or command-specific help  
  11. :history [num] show the history (optional num is commands to show)  
  12. ... 其他消息  
  13.  
  14. scala> val s = "Hello, World!" 
  15. s: String = Hello, World!  
  16.  
  17. scala> println("Hello, World!")  
  18. Hello, World!  
  19.  
  20. scala> 1 + 2  
  21. res3: Int = 3 
  22.  
  23. scala> s.con<tab> 
  24. concat   contains   contentEquals  
  25.  
  26. scala> s.contains("el")  
  27. res4: Boolean = true 
  28.  
  29. scala> :quit  
  30. $     #返回shell提示符 

我们为变量s 赋予了string 值"Hello,World!",通过使用val 关键字,我们将变量s 声明成不可变值。println 函数(http://www.scala-lang.org/api/current/index.html#scala.Console$) 将在控制台中打印一个字符串,并会在字符串结尾处打印换行符。

println 函数与Java 中的System.out.println(http://docs.oracle.com/javase/8/docs/api/java/ lang/System.html)作用一致。同样,Scala 也使用了Java 提供的String 类型(http://docs. oracle.com/javase/8/docs/api/java/lang/String.html)。

接下来,请注意我们要将两个数字相加,由于我们并未将运算的结果赋予任何一个变量, 因此REPL 帮我们将变量命名为res3,我们可以在随后的表达式中运用该变量。

REPL 支持tab 补全。例子中显示输入命令s.con<tab> 表示的是在s.con 后输入tab 符。REPL 将列出一组可能会被调用的方法名。在本例中表达式最后调用了contains 方法。

最后,调用:quit 命令退出REPL。也可以使用Ctrl-D 退出。

接下来,我们将看到更多REPL 命令,在21.1 节中,我们将更深入地探索REPL 的各个命令。