Scala的Option类型

关于erlang和scala这两个分布式程序设计语言的文章,且对他们之间的好坏优劣做了个比较,老纪今天把它翻译出来供大家参考, 原文在这里

在 我把时间浪费在可恶的社会新闻站点的活动上时,我看到越来越多关于scala的文章,我对scala开始感兴趣的主要原因有两点:1)scala是 OO(面向对象)/FP(函数编程)的混杂体,我想任何把函数编程的理念引入到面向对象的世界都是很好的一件事。2)scala的actor库严重的受到 erlang的影响,scala有时作为一个伟大的构建可扩展的并行应用语言而被提及到,就像erlang一样。

有 几次,我看到scala和erlang的比较资料。erlang对于并行编程是非常好的,在他的应用环境中有很好的运行记录,但是他很难成为主流,他是陌 生的,也没有很多库的支持。而scala这两点都很占优,他有函数编程的语义,他的Actors库提供了erlang式的并行,他运行在jvm上且能使用 所有的java库,这些组合使scala在构建并行应用上成为更好的选择,特别是在java上已经有了投资的公司。

我没有用scala编过代码,但是我对他进行了一些很好的研究,看起来它是一个非常好的语言。我认识的一些最好的程序员都称赞过它。我想scala会是java的一个很好的替代品,函数对象、类型推导、混合、模式匹配都是非常好的语言特性,而这些正是java严重缺乏的。

尽 管我相信scala是一个明显优于java的伟大的语言,但scala不会取代erlang成为我构建高可用、低延、大规模并行应用的语言。scala的 actors库是一个大的改善,这是java在并行编程方面必须面对的。但是它没有提供所有erlang式并行的好处,而这使erlang在并行处理方面 成为一个伟大的工具。我在这些方面做了大量的研究,这些是我认为一个人在scala和erlang中做出选择时而必须考虑的几个重要不同点。

并行编程

scala 的actors库在模拟仿真erlang式的消息传递方面做了很好的工作。和erlang进程类似,scala的actors通过信箱接受发送消息,像 erlang,scala在接收消息时有模式匹配语义,这会产生简洁、优雅的代码。scala的actors库走的更远,但是它没有使并行编程更简单的特 性:不变性(老纪觉得scala提供了这种特性,val声明的变量都具有这种特性)。在erlang中很多进程在一虚拟机中可以共享同一数据,语言本身保 证竞争条件不会发生,因为数据都是不可变的。在scala中,你可以在actors间发送指向可变对象的指针,这是造成竞争条件的典型方法。他让你停留在 你开始的地方:不得不取保方位共享内存的同步

假 如你很小心,你可以通过拷贝所有信息或者认为发送的信息是不变的的方法避免这个问题,但是scala不保证方位共享对象的安全性,而erlang能够在语 言层面上保证(老纪认为通过正确的编程风格能够保证这一点,而scala的这种特性有时还能使程序设计更简单些,但是这样做的一个结果就是后期维护的难度 会加大,所以坚持一种风格就一直坚持下去)

代码热交换

热 代码交换是一个杀手级特性,它不仅消除了代码升级时的停机时间,它也使语言更具生产效率,因为它可以实现真正的交互式编程。通过热代码交换,你可以在不停 止服务器、重新编译代码、重启服务器这个流程的情况下测试代码更改后的影响,而且你也能回到代码更改前的状态。热代码交换是我喜欢在erlang编程的主 要原因。

在开发阶段,jvm对于热代码交换支持的很有限,我相信它只是在运行是改变了一个函数体,这个能力较erlang的热代码交换来说不是太强劲,erlang在任何时刻对改变的代码起作用

erlang热代码交换的一个最个的方面是当你调用新代码是,vm保留代码的前一版本,这就在老版本代码被最终删除之前给你一个接收消息执行代码交换的机会。这是据我所知erlang独一无二的特性。

热代码交换对于实时应用来说更重要,因为它能够在用户之间同步通讯,重启服务会导致用户session失效,这是很糟的用户体验,假设正在完魔兽,重大战役中你的连接因为开发人员想在代码中加入一条诊断记录而断开了,这是非常令人骂人的一件事。

垃圾收集

对支持垃圾收集语言的一个共同的论点是它不适合低延迟应用,因为潜在的垃圾清扫会冻结VM,现代的GC优化想分代收集可能缓解这个问题,但不完全,偶尔老代的需要收集,这回触发很长的清扫动作。

erlang 被设计成能够构建具有软实时性能应用,erlang的GC也为这个目的而优化,在erlang中,进程的堆是独立的,所以GC也是对立的,这就最小化了因 为垃圾收集而导致进程被冻结的时间。erlang也有ets,一个用于存储大量数据的内存存储工具,但是它不参与垃圾回收

在这,erlang可能没有一个决定性优势,JVM有一个新的并行垃圾回收机制用意最小化冻结时间,这个收集器因为更短的冻结而优化性能和内存开销,我没有找到任何关于它应用于产品的显示它多好的评测,不过,假设它是和erlang一样适合于低延迟应用。

-----------------------------------------------------------------------------------------------------------------------------

为了让所有东西都是对象的目标更加一致,也为了遵循函数式编程的习惯,Scala鼓励你在变量和函数返回值可能不会引用任何值的时候使用Option类型。在没有值的时候,使用None,这是Option的一个子类。如果有值可以引用,就使用Some来包含这个值。Some也是Option的子类。
None被声明为一个对象,而不是一个类,因为我们只需要它的一个实例。这样,它多少有点像null关键字,但它却是一个实实在在的,有方法的对象。

单独对一个map对象使用get方法,获取到的是一个Option类,获取里面的数值,需要再次调用运行一下get方法,例如

复制代码
 1 object Test {
 2    def main(args: Array[String]) {
 3       val imap=Map(5->"test")
 4       val a:Option[Int] = Some(5)
 5       val b:Option[Int] = None
 6 
 7       println("a.getOrElse(0): " + imap.get(5).getOrElse(0) )
 8       println("b.getOrElse(10): " + b.getOrElse(10) )
 9    }
10 }
复制代码

getOrElse会输出默认值10,如果获取到则进行输出

1
2
a.getOrElse( 0 ) : test
b.getOrElse( 10 ) : 10
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值