1.2.2 执行Scala命令行工具
如果你单独安装了Scala 命令行工具,会发现与Java 编译器javac 相似,Scala 编译器叫作scalac。我们会使用SBT 执行编译工作,而不会直接使用scalac。不过如果你曾运行过javac 命令,会发现scalac 语法也很直接。
在命令行窗口中运行-version 命令,便可查看到当前运行的scalac 版本以及命令行参数帮助信息。与之前一样,在$ 提示符后输入文本。之后生成的文本便是命令输出。
- $ scalac -version
- Scala compiler version 2.11.2 -- Copyright 2002-2013, LAMP/EPFL
- $ scalac -help
- Usage: scalac <options> <source files>
- where possible standard options include:
- -Dproperty=value Pass -Dproperty=value directly to the runtime system.
- -J<flag> Pass <flag> directly to the runtime system.
- -P:<plugin>:<opt> Pass an option to a plugin
- ...
与之类似,执行下列scala 命令也可以查看Scala 版本及命令参数帮助。
- $ scala -version
- Scala code runner version 2.11.2 -- Copyright 2002-2013, LAMP/EPFL
- $ scala -help
- Usage: scala <options> [<script|class|object|jar> <arguments>]
- or scala -help
- All options to scalac (see scalac -help) are also allowed.
- ...
有时我们会使用scala 来运行Scala"脚本"文件, 而java 命令行却没有提供类似的功能。下面将要执行的脚本来源于我们的示例代码:
- // src/main/scala/progscala2/introscala/upper1.sc c
- lass Upper {
- def upper(strings: String*): Seq[String] = {
- strings.map((s:String) => s.toUpperCase())
- }
- }
- val up = new Upper
- println(up.upper("Hello", "World!"))
我们将调用scala 命令执行该脚本。也请读者尝试运行该示例。上述代码使用的文件路径适用于Linux 和Mac OS X 系统。我假设,当前的工作目录位于代码示例所在的根目录。如果使用Windows 系统,请在路径中使用反斜杠。
- $ scala src/main/scala/progscala2/introscala/upper1.sc
- ArrayBuffer(HELLO, WORLD!)
现在我们终于满足了编程图书或向导的一条不成文的规定:第一个程序必须打印"Hello World!"。
最后提一下,执行scala 命令时,如果未指定主程序或脚本文件,那么scala 将进入REPL 模式,这与在sbt 中运行console 命令类似。(不过,运行scala 时的classpath 与执行console 任务的classpath 不同。)下面列出的REPL 会话中讲解了一些有用的命令。(如果你未独立安装Scala,在sbt 中执行console 任务也能进入Scala REPL 环境)。此时, REPL 提示符是scala>(此处省略了一些输出信息)。
- $ scala
- Welcome to Scala version 2.11.2 (Java HotSpot(TM)...).
- Type in expressions to have them evaluated.
- Type :help for more information.
- scala> :help
- All commands can be abbreviated, e.g. :he instead of :help.
- :cp <path> add a jar or directory to the classpath
- :edit <id>|<line> edit history
- :help [command] print this summary or command-specific help
- :history [num] show the history (optional num is commands to show)
- ... 其他消息
- scala> val s = "Hello, World!"
- s: String = Hello, World!
- scala> println("Hello, World!")
- Hello, World!
- scala> 1 + 2
- res3: Int = 3
- scala> s.con<tab>
- concat contains contentEquals
- scala> s.contains("el")
- res4: Boolean = true
- scala> :quit
- $ #返回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 的各个命令。