Hello World in Scala

学习Scala的语法,还是从Hello World开始吧:

object HelloWorld {
  def main(args: Array[String]) {
    print("Hello World, Scala!")
  }
}

编译,

scalac HelloWorld.scala

运行,

scala -classpath . HelloWorld

在控制台输出:

Hello World, Scala!

跟Java挺像!需要注意的是,main函数没有返回值(procedure method)。

在Scala中,可以每行写一条语句,行末不用使用;分隔,如果在同一行书写多条语句,语句间需要用;隔开。

Interaction with Java

Scala运行于JVM之上,Scala代码也很容易与Java代码进行交互。Scala中,可以使用import来导入Java的包,java.lang包会默认导入,其他的包需要显式导入。Scala中的import与Java相比有一些语法上的扩展,使得更灵活易用。例如:

import java.lang.{Math, Boolean} // import Math 和 Boolean
import java.lang.Math._ // import java.lang.Math包中的所有内容

Scala与Java进行代码级的交互的例子:

import java.util.{Data, Locale}

object Main {
  def main(args: Array[String]) {
    val now = new Date
    print(now)
  }
}

编译,运行,得到输出:

Thu Mar 26 23:31:14 CST 2015

面向对象特性

Scala是一门纯面向对象的语言(a pure object-oritented language),一切皆对象,(everything is an object),包括数字、函数等。在这一点上,Scala与Java之间存在差异,Java中区分基本类型与引用类型,例如boolean与Boolean、int与Integer,并且,在Java中,函数不能被当成值来操作。

纯面向对象的一个体现:

1+2*3

等价于:

1.+(2.*(3))

运算符+-*/等都是number对象的方法。

Scala中,函数也是对象,可以把函数当成值来传参和作为函数返回值,这也是Scala函数式编程特性的体现。将函数作为参数传递时类似C/C++中的函数指针。如下例:

object Main {  

  def timer(callback: () => Unit) : Unit {
    var cnt = 0       // var表示定义变量
    while(cnt < 10) {
      Thread sleep 2000
      cnt += 1
      callback()
    }
  }

  def task() : Unit {
    println("working...")
  }

  def main(args: Array[String]) : Unit {
    timer(task)
  }

此处,timer函数进行传递回调函数是,还可以使用匿名函数,写成这样:

    timer(() => Unit {
      println("working...")
    })

面向对象自然少不了类的概念,在Scala中,也是用class关键字来定义类。例如,用Scala定义一个Person类:

class Student {
  private var id = Int.MaxValue
  def setId(id: Int) {
    
  }
}
class Person(id: Integer, name: String) {
}

可以用

var p = new Person(10, "abcd")

来实例化得到一个Person类的对象p。

同样,在类中也可以定义类的方法和属性,只是在这一点上Scala更多地具有函数式编程的特点。在这一点上,Scala的语法与Haskell的“绑定”类似。举例:

class Person(id: Integer, name: String) {
  def aid = id
  def aname = name
  def getId(pid: Integer) = id
  def getName(pname: String) = name
}