1. 入门程序
object Hello {
def main(args:Array[String]) {
println("Hello, Scala。")
}
}
对于包含 main 方法的 object 声明,引入了一个通常被称为单例对象(singleton object)的概念,也就是有且仅有一个实例
的类。
main 方法并没有声明为 static。这是因为 Scala 中不存在静态成员(无论方法还是属性,methods or fields)这一概念,
Scala 使用前述的单例对象(singleton objects)中的成员来代替静态成员。
Scala 的编译器 的工作流程和多数编译器类似:从命令行上接收待编译的源文件名(source file)以及编译参数,生
成一个或者多个目标文件(object files,或者叫对象文件)。Scala 生成的目标文件是标准的 java class 文件。
2. 采用Java工具类的Scala
import java.util.{Date, Locale}
import java.text.DateFormat
import java.text.DateFormat._
object FrenchDate {
def main(args: Array[String]) {
val now = new Date
val df = getDateInstance(LONG, Locale.FRANCE)
println(df format now)
}
}
结果:
5 janvier 2021
要想引入一个包中的多个类,在 Scala 中可以写在一行上,只需要把多个类名放到一个大括号中(curly braces, {})即可。如果要引入一个包或者类中的所有名字,Scala 使用下划线(underscore,_)而不是星号(asterisk,*),这是因为,在 Scala中,星号是一个合法的标识符(比如:方法名)。
如果一个方法只接受一个参数,那么可以使用 infix 语法,df format now
和 df.format(now)
的语义完全相同,只是前者更加简洁。
Scala 中可以直接继承 Java的类或者实现 Java 的接口。
3. Scala 一切皆对象
假如我们要开发一个定时器,该定时器每秒钟执行一定的动作,我们如何把要执行的动作传给定时器?最直
观的回答是:传一个实现动作的函数(function)。
负责定时的函数(function)名为:oncePerSecond,它接受一个回调函数作为参数,该回调函数的类型记为:() => Unit,代表任何无参数、无返回值的函数(Unit 和 C/C++中的 void 类似)。
object Timer {
def oncePerSecond(callback: () => Unit){
while (true) { callback(); Thread sleep 1000}
}
def timerAction(){
println("Time files like an arrow.")
}
def main(args: Array[String]){
oncePerSecond(timerAction)
}
}
运行结果:
Time files like an arrow.
Time files like an arrow.
Time files like an arrow.
Time files like an arrow.
参考: