自从《C编程语言》这本书出版以来,很多编程书都以 “Hello,World” 示例开始,按照传统,下面是Scala的一个 “Hello,World” 示例:
object Hello {
def main(args: Array[String]) = {
println("Hello, world")
}
}
用文本编辑器,把上面的代码保存在 Hello.scala 的文件中。保存好后,在命令行提示符下运行 scalac 来编译它:
$ scalac Hello.scala
scalac 就像 javac ,这个命令创建两个新的文件:
- Hello$.class
- Hello.class
与javac 创建的 “.class” 字节码文件类型一样,也准备好可以在 JVM 中运行了。
现在你可以用scala命令来运行Hello 程序:
$ scala Hello
详细的描述
下面是刚才的那段源代码:
object Hello {
def main(args: Array[String]) = {
println("Hello, world")
}
}
下面是关于这段代码的简短描述:
- 在 Scala 的叫做 Hello 的 object 里定义了一个 叫做 main 的方法。
- object 类似于 class ,当你只需要那个类的单一实例时,你可以专门使用它。
- 如果你是从 Java 来到 Scala, 这里的 main 就像一个 static 方法。
- main 接收一个名为 args 的输入参数,它是一个字符串数组
- Array 是包装Java数组原语的类
Scala代码与Java代码有很大的相似,下面是Java的代码:
public class Hello {
public static void main(String[] args) {
System.out.println("Hello, world")
}
}
深入:Scala创建 .class 文件
就像上面提到的,当我们运行 scalac 命令,它创建 .class JVM 字节码文件。你可以自己看看这个。
例如,对Hello.class文件运行 javap 命令:
$ javap Hello.class
Compiled from "Hello.scala"
public final class Hello {
public static void main(java.lang.String[]);
}
就像输出显示的,javap 读取的 .class 文件,就像是从Java源代码编译来的。Scala 运行在JVM上,并且可以使用现有的Java库,对Scala程序员来说,二者都是非常好的好处。
Hello,World ---- 第二版
尽管第一个 “Hello world” 例子运行的很好,Scala 提供了另一种更便利的编写应用程序的方式。
object 可以只继承 App 特质,而不用包含 main 方法,像下面这样:
object Hello2 extends App {
println("Hello, world")
}
如果你保持到 Hello.scala , 用 scalac 进行编译,然后再用 scala 运行,你会看到跟先前一样的结果。
这是因为 App 特质有它自己的 main 方法,因此你不必再自己写一个。之后我们会为你展示用这种方式时如何获取命令行参数,但是简而言之这很容易:在一个名为 args 的字符串数组里可以获取它们。
我们还没有展示 trait , 但它与Java的抽象类类似。
(更确定的说,它是抽象类和接口的结合--后面会介绍更多!)
进一步的展示
如果你想看看这个对象继承 App 特质后,命令行参数是如何运行的,保存下面的代码在名为 HelloYou.scala 的文件中:
object HelloYou extends App {
if (args.size == 0)
println("Hello, you")
else
println("Hello, " + args(0))
}
在命令行用 scalac 编译它:
scalac HelloYou.scala
接着分别不带命令行参数和带命令行参数地运行它:
$ scala HelloYou
Hello, you
$ scala HelloYou Al
Hello, Al
可见:
- 命令行参数可以自动的在名为 args 的变量中获取
- 你通过 args.size 查看在 args 中的元素的个数。(如果你喜欢,也可以 args.length)
- args 是数组,你可以这样 args(0), args(1) 访问Array 的元素。因为 args 是一个对象,你使用圆括号来访问数组元素(而不是 [ ] ,或任何别的语法)。