在Scala中,一切皆对象!比Java的面向对象理念还彻底!
Scala里,数字是对象,函数也是对象!
数字是对象
比如:1 + 2 * 3 / 2,和下面这个是一样的:
(1).+(((2).*(3))./(2))
可以看出,“+”,“-”,“*”,“/”在Scala中同样是有效的名称。
在第二个表达式中的这些括号是必须的,因为 Scala 的分词器使用最长规则来进行分词。所以它会把下面的表达式:
1.+(2)
理解成表达项“1.”,“+”,和“2”的组合。这样的组合结果是由于“1.”是一个有效的表达项并且比表达项“1”要长,表达项“1.”会被当作“1.0”,使得它成为一个double类型而非int类型。而下面的表达式阻止了分析器错误的理解:
(1).+(2)
函数是对象
把函数当成值进行操作是函数型编程语言的基石。
函数在Scala语言里面是一个对象,把函数作为参数进行传递,把它们存贮在变量中,或者当作另一
个函数的返回值都是可能的。
函数是对象,将给Scala填上无穷的威力,这点是Java语言做不到的。
来看个计时器的例子:
object Timer {
def oncePerSecond(callback: () => Unit) {
while (true) {callback(); Thread sleep 1000 }
}
//作为回调的函数
def timeFlies() {
//使用预定义的函数println,而非使用System.out.println(...)
println("每秒都打印一下..")
}
//主函数调用计时器并传递打印句子的函数作为回调,这个程序永无止境的每秒打印一句话
def main(args: Array[String]) {
oncePerSecond(timeFlies)
}
}
运行如下:
用匿名函数改进定时器程序
上面的定时器函数完全可以用匿名函数写得更简洁一些的。
object TimerAnonymous {
def oncePerSecond(callback: () => Unit) {
while (true) {callback(); Thread sleep 1000 }
}
def main(args: Array[String]) {
oncePerSecond(() =>
println("每秒都打印一下.."))
}
}
有没有发现呢?Scala真的很酷!很多好玩的!
阅读(724) | 评论(0) | 转发(0) |