第2章 起步

让我们开始写一些Scala代码吧!在这一章里,你会装上Scala,确保一切都能在系统中运作良好。

2.1 下载Scala

Scala起步很简单。首先,访问http://www.scala-lang.org,点击“Download Scala”链接,下载最新的稳定版本。选择最适合你所用的平台的版本,排在最上面的是当前的发布版本①。在Mac OS X上,我下载的是scala-2.7.4.final.tar.gz,在Windows Vista上,我下载的就是scala-2.7.4.final.zip。如果你对Scala API或者源码感兴趣,就需要下载其他的文件。

①如果你想找早期的版本,在页面上有一节是“Previous Releases”。

本书的例子是在Scala 2.7.4版本上运行通过的。如果你是个追求最前沿技术的家伙,稳定版本肯定满足不了你的需求。这个语言实现在不断更新,你所需要的就是它的最新版本。在下载页面上往下找,找到“Release Candidate”一节,下载适合你所用平台最新的候选版本。当然,如果你想要实时更新的版本,而且愿意承担风险,还可以下载每日构建的版本。

不管你选了哪个版本,都需要JDK1.4或更高版本②的支持。我推荐你至少要用Java 5,这样才能在Scala中享受到最新的Java语言特性。花点时间检查一下,看看Java装的是哪个版本,是不是能用。

②参见http://java.sun.com/javase/downloads/index.jsp

2.2 安装Scala

先把Scala装起来吧!前提是你已经下载了Scala 2.7.4的二进制发行版,并且Java也装好了。(参见2.1节。)

2.2.1 在Windows上安装Scala

把发行包解压缩——我是直接右击scala-2.7.4.final.zip然后选择“Extract Here”。接着把解压缩后的目录拷贝到合适的位置,比如我就把scala-2.7.4.final挪到了C:\programs\ scala目录下。③

③我推荐你选择一个中间不带空格的路径,因为有空格的路径名常常会带来麻烦。

还有一步工作要做。你要设置Scala bin目录的路径。进入控制面板,打开“系统”,选择“高级系统设置”,选择“高级”,然后选择“环境变量”④。修改path这个变量,把Scala的bin目录也放进去。比如在我的机器上,我就把C:\programs\scala\scala2.7.4.final\bin加进到path里面去了。记住,在path里用分号(;)分隔目录。

④对于Vista之外的Windows版本,请选择适当的方法来修改环境变量。

先验证一下配置是否正确。关闭所有已经打开的命令行窗口,因为对环境变量的修改要等到你重新打开窗口时才能生效。在新的命令行窗口里,输入scala -version,确保显示的版本跟你安装的版本一样。现在Scala就可以用了!

2.2.2 在类UNIX系统上安装Scala

在类Unix系统上安装Scala有好几种选择。如果你用的是Mac OS X,就可以用MacPorts的sudo port install scala命令安装。

你也可以使用下面这个命令把发行包解压缩:gunzip scala-2.7.4.final.tar.gz,然后运行tar -xf scala-2.7.4.final.tar,把解压后的目录移到一个合适的位置。在我的系统上,我把 scala-2.7.4.final目录复制到了/opt/scala目录下面。

还有一步工作要做:设置Scala bin目录的路径。

用的shell不一样,要修改的文件也不一样。你很可能已经知道了要修改哪个文件——如果需要帮助的话,请参见对应shell的文档,或者直接找了解的人问。我用的是bash,所以我修改的是 ~/.bash_profile 文件。在该文件中,我把/opt/scala/scala-2.7.4.final/bin加到了path环境变量里。

先验证一下配置是否正确。关闭所有已经打开的命令行窗口,因为环境变量的修改要等到重新打开窗口时才能生效⑤。在新的终端窗口中,输入scala -version,确保显示的版本跟你安装的版本一样。现在Scala就可以用了!

⑤从技术上来说,我们可以对配置文件执行source,但是打开个新窗口可能更省事。

2.3 让Scala跑起来

想快速尝试一下Scala的话,直接用scala这个命令行shell就行。你可以在上面尝试着运行一些简单的Scala代码片断。在编写应用的时候,这个有用的工具可以帮你快速试验一些新代码。

在命令行上(不管是终端窗口还是命令提示符),输入scala。你可以见到下面的介绍信息和一个提示符:

>scala
Welcome to Scala version 2.7.4.final (Java HotSpot(TM) Client VM,
  Java 1.5.0_16).
Type in expressions to have them evaluated.
Type :help for more information.

scala>

在提示符后面,输入val number = 6,然后回车。Scala shell会做出如下反应,表示它把number这个变量推演为Int类型,因为我们给变量的赋值是6。

scala> val number = 6
number: Int = 6

scala>

现在试着输入number = 7,Scala会给出下面的错误信息:

scala> number = 7
<console>:5: error: reassignment to val
       number = 7
              ^

scala>

Scala告诉我们,number这个常量不能重新赋值。但我们还是可以在控制台上重新定义常量与变量。例如输入val number = 7,Scala就能接受了。

scala> val number = 7
number: Int = 7

scala>

只有在交互式shell上,我们才能在同一个作用范围内对常量和变量进行重新定义,这在真正的Scala代码或者脚本中是行不通的——所以说,shell的这种灵活性让我们可以更轻松地在上面进行试验。

输入val list = List(1, 2, 3),你会发现Scala推演出了List的类型并输出:List: List[Int] = List(1, 2, 3)。无论什么时候,只要你不确定某个表达式会被推演成什么类型,你都可以很快地在shell里试出结果。

你可以用“up”键找到之前输入的命令。它甚至还可以找到上一次调用shell时用过的命令。输入命令的时候,你可以用Ctrl+A回到行首,用Ctrl+E到达行尾。

只要你敲下回车键,shell就会立刻执行你输入的东西。如果你的语句没写完(例如方法定义写了一半)就按了回车,shell会提示一个竖线(|),让你把定义写完。例如下面我就是用了两行来完成isPalindrome()方法的定义,然后调用了两次并查看结果:

scala> def isPalindrome(str: String) =
     | str == str.reverse.toString()
isPalindrome: (String)Boolean

scala> isPalindrome("mom")
res1: Boolean = true

scala> isPalindrome("dude")
res2: Boolean = false

scala>

Shell上的工作做完以后,你可以输入:quit或者exit退出shell。除了用shell外,我们还可以在命令行上用-e这个选项(其含义为执行参数)把简短的语句或是表达式传给Scala。

GettingStarted/RunScalaOnCommandLine.cmd

scala -e "println(\"Hello \"+args(0)+\", \"+args(1))" Buddy
  "Welcome to Scala"

Scala会返回下面的信息:

Hello Buddy, Welcome to Scala

我们用了()而不是[]来索引args变量——这是个Scala的惯用法,我们稍后讨论。

如果你在文件里写好了Scala代码,可以用:load选项把它载入shell。比如要加载一个名为script.scala的文件,就在shell里面输入:load script.scala。这个选项可以用来加载预先写好的函数和类,并在shell里试验它们。

2.4 命令行上的Scala

尽管shell和-e选项提供了很便捷的方式试验代码片断,但如果你想执行文件中Scala代码,那么就会用到scala命令。在没有提供参数的情况下,它会以交互模式运行;如果提供了文件名,它就会以批处理模式运行。代码文件可以是脚本,也可以是目标文件(目标文件是指编译器生成的.class文件)。默认情况下,你都可以让这个工具去测试你所提供的文件是哪种类型,也可以用-howtorun选项来告诉它,提供的到底是脚本文件,还是目标文件。最后一点,在给它传递Java属性的时候,可以用-Dproperty= value格式。

假设我们已经有了一个文件,叫做Helloworld.scala:

GettingStarted/HelloWorld.scala

println("Hello World, Welcome to Scala")

我们可以用scala HelloWorld.scala这个命令来执行上面的脚本:

> scala HelloWorld.scala
Hello World, Welcome to Scala
>

不管有什么样的参数需要传入,都可以附加在文件名后面。

把Scala代码写到文件里面当作脚本执行,这个功能是相当方便的。你可以写一些跟系统维护或者管理任务相关的代码,然后在命令行或者你喜欢的IDE里面运行,无须额外的编译工作。

Scala工具在内存里把脚本编译成字节码,然后执行。它把代码放到一个传统的main()方法中,这个方法归属于一个名叫Main的类。所以当你执行脚本的时候,实际上执行的是Main这个类中的main()方法。如果你想看生成的字节码,可以在文件名前面加上-savecompiled选项,Scala工具会把字节码存成一个JAR文件。

2.5 把Scala代码当作脚本运行

当你开始用Scala写脚本以后,你会发现执行Scala文件就跟执行shell脚本一样简单。

2.5.1 在类UNIX系统上作为脚本运行

在类Unix系统上,你可以设置一个shell前导词(preamble)来执行脚本。如下例:

GettingStarted/Script.scala

#!/usr/bin/env scala
!#
println("Hello " + args(0))

先输入chmod +x Script.scala,确保你对Script.scala文件有执行权限。然后执行此文件,在命令行上输入./Script.scala Buddy——Buddy是传给脚本的参数。

输出如下:

Hello Buddy

2.5.2 在Windows上作为脚本运行

你可以配置Windows,让它在运行.scala文件的时候调用Scala。打开资源浏览器,双击一个带.scala扩展名的Scala脚本文件。Windows会告诉你它打不开这个文件,并让你从已安装的程序列表里面选择一个程序去打开它。找到Scala安装的位置,选择scala.bat。现在就可以在资源浏览器里面通过双击文件来执行程序了。在命令行里面运行也行,现在就不用带命令前缀.scala了。如果在资源浏览器里面双击程序,你会发现有一个窗口先是弹出来,然后显示执行结果,接着很快就关掉了。想让窗口保持打开状态的话,可以把文件指向一个.bat文件,让这个.bat文件运行完Scala之后暂停。右键单击某个Scala程序,选择“Open With…”,找到该bat文件。

下面是.bat文件的一个例子:

GettingStarted/RunScala.bat

echo off
cls
call scala %1
pause

当你双击Helloworld.scala以后,上面那个.bat文件会自动执行,得到下面的结果:

2.6 在IDE里面运行Scala

作为Java程序员,最有可能是用IDE开发应用程序。

Eclipse、IntelliJ IDEA、NetBeans这三款IDE都有对应的Scala插件(参见附录A)。用了这些IDE,就可以在使用Scala的时候享受跟Java一样的待遇,如语法高亮,代码补全,调试,合适的缩进,等等。此外,你还可以在同一个项目中混合或是互相引用Scala和Java代码。

在Scala的网站上有为Eclipse安装Scala插件的说明文档,参见http://www.scala-lang.org/node/94

2.7 编译Scala

下面讲述如何写一个类,用scalac编译器编译。

在下面的例子中,我们定义了一个对象,名叫Sample。(你很快会学到,Scala不支持静态方法,要想写静态的main()方法,就得定义一个对象——一个单例⑥)

⑥此处原文为Singleton class,经过与作者沟通,确认class这个词应该去掉。所以译作“单例”,而非“单例类”。——译者注


GettingStarted/Sample.scala

object Sample {
  def main(args: Array[String]) = println("Hello Scala")
}

我们可以用scalac Sample.scala这个命令对它进行编译。执行的方法有两种,一种是用scala工具,一种是用java命令。用scala工具的话,输入scala Sample就行。用java工具的话,还得需要在classpath里指定scala-library.jar。下面的例子中,先是用了scalac进行编译,然后分别使用scala工具和java工具执行;在我的mac上是这样做的:

> scalac Sample.scala
> scala Sample
Hello Scala
> java -classpath /opt/scala/scala-2.7.4.final/lib/scala-library.jar:. Sample
Hello Scala
>

在Windows上,你可以把classpath指向scala-library.jar所在的位置。在我的Vista虚拟机上,我就设成了C:\programs\scala\scala-2.7.4.final\lib\scalalibrary. jar;

在本章中,我们装好了Scala,做了些简单尝试。现在你应该准备好进入Scala编程的具体细节了。

目录

  • 版权声明
  • 读者推荐
  • 译者序
  • 第1章 简介
  • 第2章 起步
  • 第3章 Scala步入正轨
  • 第4章 Scala的类
  • 第5章 自适应类型
  • 第6章 函数值和闭包
  • 第7章 Trait和类型转换
  • 第8章 使用容器
  • 第9章 模式匹配和正则表达式
  • 第10章 并发编程
  • 第11章 与Java互操作
  • 第12章 用Scala做单元测试
  • 第13章 异常处理
  • 第14章 使用Scala
  • 附录A Web资源