学习Scala第一篇-从hello World开始

最近开始系统性的学习scala。其实之前使用过scala的,比如我在用Gatling这款性能测试工具的时候就接触到了scala了。Gatling本身就是用Scala写的,而且Gatling的性能测试配置文件本身就是一个scala类,可以随意使用scala甚至是Java提供的各种类库。当时觉得用Gatling特别舒服的原因就在于配置文件强大的表现力。而这种表现力就是由Scala语言提供的。

言归正传,学习Scala还是从最简单的Hello world开始。在Scala官网中显著的标题就是:

Object-Oriented Meets Functional

Have the best of both worlds. Construct elegant class hierarchies for maximum code reuse and extensibility, implement their behavior using higher-order functions. Or anything in-between.

从中可以看出Scala结合了面向对象及函数式编程这两种编程范式。在本文中我将会拿Java语言和其比较,看看到底Scala强在那里。

使用Java语言实现一个Hello World的代码如下:

1
2
3
4
5
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}

以下是Scala的实现:

1
2
3
4
5
object HelloWorld  {
  def main(args: Array[String]): Unit = {
    println("Hello, World!")
  }
}

好吧,如果标点符号不算代码行,Java版本和Scala版本的实现的代码行数是一致的。貌似Scala并没有减少什么。唯一减少的就在于println不用指定类名,以及对main方法不用声明为static。

在这里对Scala实现与Java实现的几个不同之处做个介绍。

  • 第一是Scala对HelloWorld的修饰符使用的是object。其实Scala中也有class关键字,那么object关键字和class关键字有什么区别那?简单来说object关键字定义了一个匿名类,并且创建了该匿名类的单个实例(采用单例模式),该实例名为HelloWorld。所以object中定义的方法自动都是static的。我觉得object关键字存在的价值之一就是建立起了面向对象和函数式的桥梁。因为在面向对象的系统中,所有方法都必须存在于类中,而函数式编程中没有类的概念,使用函数无需new类的实例,所以object中的方法都是静态方法,可以直接被调用。进一步解读请到这里
  • 第二是Scala中对变量的类型的定义方式是变量名在前,类型在后,中间用冒号相隔。原因之一是代码更可读。因为我们更关心变量名,而类型其次,尤其是你拥有一个超级长的类型的情况下(比如
    HashMap<Shape, Pair<String, String>>);原因之二据说是这样的方式在实现Scala类型时技术上要简单些。进一步解读请到这里
  • 第三是main函数的返回值是Unit,而不是Java中的Void。为什么是这样那?我想是因为Scala为了实现自己的类型系统,对于无显式返回值的函数直接使用Void是不合适的。在Scala.Unit文档中是这样定义Unit的:
Unit is a subtype of scala.AnyVal. There is only one value of type Unit, (), and it is not represented by any object in the underlying runtime system. A method with return type Unit is analogous to a Java method which is declared void.

  • 第四是Scala中表达式最后的分号是可选的。原因就是为了契合函数式编程的哲学,即一切尽可能的简单。不写分号程序员一天可以多敲一些代码出来。

好吧,其实在Scala中Hello World还有一种写法。

1
2
3
object HelloWordV2 extends App {
  println("Hello, World!")
}

代码从三行减少到了两行,Scala终于胜出了。那么App是个什么鬼?App是一个trait。trait又是什么鬼?trait是Scala中的一个特殊类型,它与Java中的interface很相似,但比interface强大。HelloWordV2添加了对App的扩展后,就自动成为了一个可以运行的程序,由于App中定义了main方法,所以HelloWorldV2中就无需再定义了,牛逼的地方在于HelloWorldV2的body中的代码都会作为main方法中的代码被执行。以下是App源码中对main方法的定义:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@deprecatedOverriding("main should not be overridden", "2.11.0")
def main(args: Array[String]) = {

this._args = args

for (proc <- initCode) proc()

if (util.Properties.propIsSet("scala.time")) {

val total = currentTime - executionStart

Console.println("[total " + total + "ms]")

}

看来App在实现main方法时还设置了一个计时器,通过scala.time这个属性来开关。所以没事翻翻源码还是挺好玩的。

不知有没注意到其实main方法是有个叫args的参数的,那么新版HelloWorld中如何使用该参数那?直接使用它就行。

1
2
3
object HelloWordV2 extends App {
  println("Hello, World!" + args(0))
}

ok,Scala版的Hello World就到这里吧。

时间: 2024-09-20 00:33:36

学习Scala第一篇-从hello World开始的相关文章

ActionBarSherlock学习笔记 第一篇——部署

ActionBarSherlock学习笔记 第一篇--部署         ActionBarSherlock是JakeWharton编写的一个开源框架,使用这个框架,可以实现在所有的Android版本上实现ActionBar的效果和功能.当在4.0+的版本使用时,会使用Android自身的ActionBar,当在4.0之前的版本使用时,则会使用ActionBarSherlock自身自定义的一套框架来实现ActionBar的功能.     要获得ActionBarSherlock,我们可以到Gi

Oracle数据库学习之第一篇

  权限管理: oracle 9里面默认的三个用户名和密码: sys change_on_install //权限最高的管理员 system manager //普通的管理员 scott tiger //普通用户 在oracle 10中,仍然使用这三个用户作为默认用户.但sys和system用户的密码不再默认.在安装数据库的时候,可以由用户指定 .从安全角度考虑,scott用户默认被锁定,所以要使用该用户,需要先解除锁定. 注意:我们要使用oracle数据库,至少要启动两个服务,一个是监听服务,

学习动态性能表 第一篇--v$sysstat

  学习动态性能表 第一篇--v$sysstat  按照OracleDocument中的描述,v$sysstat存储自数据库实例运行那刻起就开始累计全实例(instance-wide)的资源使用情况. 类似于v$sesstat,该视图存储下列的统计信息: 1>.事件发生次数的统计(如:user commits) 2>.数据产生,存取或者操作的total列(如:redo size) 3>.如果TIMED_STATISTICS值为true,则统计花费在执行操作上的总时间(如:CPU used

怎样学习Scala泛函编程

     确切来说应该是我打算怎么去学习Scala泛函编程.在网上找不到系统化完整的Scala泛函编程学习资料,只好把能找到的一些书籍.博客.演讲稿.论坛问答.技术说明等组织一下,希望能达到学习目的.关于Scala语言的教材在国内网上还是比较容易找到的:可以到Scala语言官方网站,国内Scala社区网站这些地方去看看了解一下:深一点的参考一下在路上,里面包括了一些泛函编程的概念性内容.     学习编程语言除了语法语意之外还必须透彻了解编程语言的数据结构(data structure):数据结

如何提高WEB程序的效率 (第一篇SQL篇)  (转)

web|程序 如何提高WEB程序的效率 (第一篇"SQL篇") 很多网友非常不喜欢用ASP来编程,他们总是抱怨说ASP程序太慢,效率太低.更希望用PHP,JSP等来写程序.其实不能从 "认为" 这个角度来看问题 ,而应该从实际中看问题,ASP真的很慢的吗,那么微软的站为何用ASP也不慢呢?PHP真的很快吗,其实它也仍然是解释性的语言.只不过在Linux下的结合比较好而以.JSP的开发也不会简单到何处,而且要通过JDBC-ODBC桥才能连接ACCESS库等,这种情况下

如何提高WEB程序的效率 (第一篇)

web|程序 很多网友非常不喜欢用ASP来编程,他们总是抱怨说ASP程序太慢,效率太低.更希望用PHP,JSP等来写程序.其实不能从 "认为" 这个角度来看问题 ,而应该从实际中看问题,ASP真的很慢的吗,那么微软的站为何用ASP也不慢呢?PHP真的很快吗,其实它也仍然是解释性的语言.只不过在Linux下的结合比较好而以.JSP的开发也不会简单到何处,而且要通过JDBC-ODBC桥才能连接ACCESS库等,这种情况下效率也不高. 其实,三种语言各有特点,就是优,缺点.作为一个程序员不应

【实战HTML5与CSS3 第一篇】初探水深,美丽的导航,绚丽的图片爆炸!!

原文http://www.cnblogs.com/yexiaochai/archive/2013/04/29/3050798.html 前言 先八卦一下,我昨天离职了,把电脑也退了,离职前,我发了一封邮件给整个部门,陈述自己的不舍与团队管理问题(估计传说中的leader要抓狂了),然后就昏昏的回家了,所以昨天没有什么产出. 最近经常有朋友惊叹我的发帖速度很快,其实是有原因的,我最近两周要离职,所以就不太理我那传说中的leader了,每天多出很多时间可以学习. 但是,下周后便会入职一家新公司了,我

[老老实实学WCF] 第一篇 Hello WCF

原文:[老老实实学WCF] 第一篇 Hello WCF 老老实实学WCF  第一篇 Hello WCF   WCF(Windows Communication Foundation)是微软公司推出的面向服务技术的集大成者,涵盖继承了其之前发布的所有的分布式应用程序的编程模型,涉及面之广,技术之复杂,结构之零散,让我们初学这门技术的菜鸟时常有无处下手的感觉,此系列博文系笔者艰难探索WCF技术过程的学习笔记,笔者抱着老老实实的态度,力图扎扎实实,循序渐进地学好这门技术,文中难免有疏漏和错误之处,还请

ASP.NET MVC学习之控制器篇扩展性

原文:ASP.NET MVC学习之控制器篇扩展性 一.前言 在之前的一篇随笔中已经讲述过控制器,而今天的随笔是作为之前的扩展.   二.正文 1.自定义动作方法 相信大家在开发过程一定会遇到动作方法的重名问题,虽然方法的名称和参数一样,但是里面的逻辑是不一样的,因为你设置了对应的注解属性可以确定调用哪个动作方法.这个时候你就需要将动作的名称与方法的名称区别开来,那么你就可以使用ActionName注解属性.比如我们要求一个页面在本地访问与非本地访问时呈现不同的页面,但是你又想用不同的方法区分开来