掌声请出,这个新的Scala学习系列。在接下来的数篇The Pragmatic Bookshelf
的文章中,我们将会学到许多学到这个基于JVM的强大语言。那么,我们为什么要学习Scala?
首先,它很有趣。如果你热衷于编程,那么你不再需要更多的理由。
让我们假设:你已经在Java领域做了很多年,并且驾轻就熟。每天早晨,当你醒来的时候,一天的编程任务的全部代码已经“写”在你脑中了。你所要做得只是输入到电脑里,然后编译他们。你是如此的专业以至于连任何的编译错误都不会出现。
有热情的程序员总是以学习为乐,不断地找出新方法来提高他们作品的质量。如果编程已经变成了索然无味的例行公事,Scala或许可以提起你的兴致。
Scala将会是你编程生活的调味剂。在Scala的世界里,你可以用比平时更少的代码完成相同的工作。你完成更多实实在在的编程任务,而不是将时间浪费那些语言和编译器的“繁文缛节”。Scala给了你最直接的实现方式,因此可以让你写出简洁,易读,高效的代码。
公平地说,Java已经演进了许多年了,也确实走过了一段很长的路。但是Java中真正好的部分却是在Java语言之下的Java虚拟机和其无所不能的类库。Java语言本身已经“廉颇老矣”了。
程序设计语言如汽车一般让我们能够驰聘平台所提供的这片大陆上。现在,是时候将笨重的吉普车换成更高效更快速的交通工具了。Scala就是一辆在JVM上飞驰的法拉利。
在设计Scala的时候,Martin Odersky(scala作者)钟情于两种强大的编程范式:面向对象编程和函数式编程。Scala不但是一个完全面向对象的语言,而且它还是混合型语言--一个带有静态类型和类型推断的函数式面向对象语言。
Scala的一个重要特性就是它的简洁。
让他们来比较下Scala和Java的简洁性。假设你是一个经验丰富的Java程序员,你自愿为那些听说Java很简单的听众讲解Java。你决定从一个简单的"hello world"例子开始将其。于是,你这样写道:
public
有人举起手问:"什么是public?"
你回答:"嗯。。。现在还不需要知道这些.我们接着来。"
public class
又有人举起手问:"什么是class?"
你又回答:"你现在还是不需要知道,先晾一边。"
public class HelloWorld {
就在这时,你偏见台下一双双渴望的眼睛闪烁着希望的光芒。你终于写到"HelloWorld"了。。。但是当你写下下一行代码的时候,这些希望都破碎了:
public class HelloWorld {
public static
有一只手举了起来:"那么,我们现在也不需要关心什么是static咯?"你心凉了。
让我们试试Scala吧。打开一个命令行提示符,按后简单的输入:
println("hello world")
在上面的情形下,或许只要这样:
> scala
Welcome to Scala version 2.9.1.final
(Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_26).
Type in expressions to have them evaluated.
Type :help for more information.
scala> println("hello world")
hello world
scala>
你打开Scala的REPL(Read Evaluate Print Loop,求值打印循环),或者交互式命令行,然后简单的输入println("hello world")
,然后结果就出来了。如果你要把代码写到一个文件里,也没什么区别。创建一个名为
helloworld.scala的文件,然后输入,保存。
println("hello world")
现在运行它,输入:
scala helloworld.scala
然后你就能看到输出结果:
hello world
你可以像脚本一样运行Scala或者像Java那样编译它。
让我们用java写一个向用户打一个招呼,一秒后自动打印goodbye消息的程序。
public class Greet {
public static void main(String[] args) {
final String name = args.length == 1 ? args[0] : "world";
System.out.println("Hello " + name);
try {
Thread.sleep(1000);
} catch(InterruptedException ex) {
//spend sleepless nights about what to do with this exception
//we're forced to handle
}
System.out.println("good bye!");
}
}
Java的编译器强制你处理sleep方法所跑出的异常。你可以catch它或者使用throws语句将它往更上层抛。让我们试着在Scala中完成这个例子:
val name = if(args.length == 1) args(0) else "world"
println("Hello " + name)
Thread.sleep(1000)
println("good bye")
保存为greet.scala然后运行。
scala greet.scala Joe
Scala的代码不但简洁,而且:
1.Scala编译器不会强制你处理异常。如果你不打算处理这个异常,它会自动将异常往更上层抛。你肯定已经见过程序员们为了与强制异常抗争而使用空catch语句。Scala希望我们干正确的时候,而不是逼迫我们。
当你使用Java编程时候,你感觉你是在为编译器工作。而你在使用Scala编程时,编译器为你工作。
2.在Java中,我们使用三元运算符?:做判断。Java同时提供if语句和三元运算符。Scala没有三元运算符,因为if在scala中也不是一个语句。它是一个可以有返回值的表达式。你会发现,这是一个Scala中的常见主题。它提供了更精简却更强大的结构。用Scala编程就好像在玩乐高玩具:小积木可以打出无穷无尽的大结构。
3.Scala不需要你去创建一个类。正如你前面看到的,你可以在scala中创建类,但是它不是强制性的。在Scala中,简单的事情有简单的做法,复杂的事情有复杂的做法。
通过上文,我们已经揭开了scala的面纱(嘿,这只是这个系列的第一篇文章)。但是,我希望它已经吊起了你对Scala的胃口。到现在为止我已经描述了一副Scala的美好图景。Scala的面向对象语法可能会吓退某些初学者。Scala由衷的不希望弄晕大家。你必须习惯这门语言的语法和一些方言。我已经听过许多初学Scala程序员的抱怨,但是我相信: 你不理Scala,Scala不理你。 某种意义上说,Scala像一头在阿凡达中的飞龙。它会试图杀死你,但是如果你驾驭了它,你可以飞翔无边的天际。
我写作的目标不是向你展示Scala的一切。换言之,我们将会学到如何应用这门语言去更高效的完成日常的编程任务。我希望你能像我一样为这个Scala系列感到兴奋。下回见,编程愉快,拍手。
原文链接:http://pragprog.com/magazines/2011-09/scala-for-the-intrigued