文档章节

谈谈Scala的特性

wiitht
 wiitht
发布于 2017/05/05 17:35
字数 2531
阅读 16
收藏 0

1.类型推断

背景:表达式的类型只在运行时才知道;这些语言被称作动态类型语言。而另一些语言中,表达式的类型在编译时就知道,这些语言叫做静态类型语言。在静态类型语言中,函数的输入和输出与局部变量的类型一般必须用类型标注明确的提供。

自动进行类型推导,可以使得编程任务变得更加简单,更加专注于问题本身;使得静态语言编写的代码像动态语言一样

1)特性:

可检验属性:静态类型系统可以保证消除某些运行时的错误。例如可以保证:布尔型不会与

整数型相加;私有变量不会从类的外部被访问;用正确数量的参数调用了函数;字符串集只能加入

字符串。不过当前的静态类型系统还不能查到其他类型的错误。比方说,通常查不到无法终结的函数,数组

越界,或除零错误。同样也查不到你的程序不符合规格说明书(假设有这么一份规格说明书)。因

此有些人认为静态类型系统不太有用而忽视它。批评说既然这种类型系统只能发现简单错误,而单

元测试能提供更广泛的覆盖,那又为何自寻烦恼使用静态类型呢?我们认为这种说法不正确。尽管

静态类型系统确实不能替代单元测试,但是却能减少用来测试这些属性的单元测试的数量。同样,

单元测试也不能替代静态类型。总而言之,如Edsger Dijkstra 所说,测试只能证明存在错误,而非

不存在。因此,静态类型能给的保证或许很简单,但这些保证无论多少测试都给不了。

 

安全的重构:静态类型系统提供了让你具有高度信心去变动代码基础的安全网。试想一个给

方法新增参数的重构实例。在静态类型语言中,你可以完成修改,重编译你的系统并简单地修改所

有引起类型错误的代码行。一旦完成了这些,你可以确信已经发现了所有需要修改的地方。这种信

心对于其他的简单重构,如改变方法名或把方法从一个类移到另一个,都会有效。静态类型检查会

在所有的例子中提供足够的确信,表明新系统和旧系统可以一样的工作。

 

文档:静态类型是被编译器检查过正确性的程序文档。不像普通的注释,类型标注永远都不

会过期(至少如果包含它的源文件近期刚刚通过编译就不会)。更进一步说,编译器和集成开发环

境可以利用类型标注提供更好的上下文帮助。举例来说,集成开发环境可以通过判定选中表达式的

静态类型,找到类型的所有成员,并全部显示出来。 

 

2)好处

def f(x: String) = ...

知道f 的变量应该是String 是有用的。另一方面,以下例子中两个标注至少有一个是讨厌的:

val x: HashMap[Int, String] = new HashMap[Int, String]()

很明显,x 是以Int 为键,String 为值的HashMap 这句话说一遍就够了;同样的句子没必要重

复两遍。

Scala 有非常精于此道的类型推断系统,能让你省略几乎所有的通常被认为是讨厌的类型信息。前面

的例子可以改写成以下两种方式:

val x = new HashMap[Int, String]()

val x: Map[Int, String] = new HashMap()

Scala 里的类型推断不止于此。实际上,就算用户代码丝毫没有显式类型也不稀奇。因此,Scala 程

序经常看上去有点像是动态类型脚本语言写出来的程序。尤其在客户应用代码中作为预编译代码库

控件的胶水代码时,表现得更为显著。而对于库控件来说不是这么回事,因为它们常常用到相当精

妙的类型去使其适于灵活使用的模式。这是由代码的实际情况决定的。毕竟,构成可重用控件接口

的成员的类型符号应该是显式给出的,因为它们构成了控件和它的使用者间契约的重要部分。

 

2.隐式转换

1)隐式转换

2)隐式参数

 

 

Scala作为一门静态语言,它的主要特性有哪些?

  · Scala是面向对象的

  Scala是一个纯面向对象语言,在某种意义上来讲所有数值都是对象。对象的类型和行为是由class和trait来描述的。Class的抽象可由子类化和一种灵活的基于mixin的组合机制(它可作为多重继承的简单替代方案)来扩展。

  · Scala是函数式的

  Scala还是一个函数式语言,在某种意义上来讲所有函数都是数值。Scala为定义匿名函数提供了一种轻量级的语法,它支持高阶(higher-order)函数、允许函数嵌套、支持局部套用(currying)。Scala的case类及其内置支持的模式匹配模型代数类型在许多函数式编程语言中都被使用。

  · Scala是静态类型的

  Scala配备了一套富有表现力的类型系统,该抽象概念以一种安全的和一致的方式被使用。

  · Scala是可扩展的

  Scala的设计承认了实践事实,领域特定应用开发通常需要领域特定语言扩展。Scala提供了一个独特的语言组合机制,这可以更加容易地以类库的形式增加新的语言结构:

  任何方式可以被用作中缀(infix)或后缀(postfix)操作符闭包按照所期望的类型(目标类型)自动地被构造

  两者结合使用可方便地定义新语句,无需扩展语法,也无需使用类似宏的元编程工具。

 

3.面向对象:
·逻辑语义:“用形式化接口绑定数据和操作”
程序需要某种结构,最好的办法就是将数据和操作放进某种形式的容器中,面向对象最伟大的思想就是将这种容器完全通用化。这样就能使得能像保存数据那样保存操作,并且还能将这些容器作为值存放到其他容器当中或作为参数传递给其他操作,这样的容器称为对象

批判:面向对象本身的设计思想使得程序具有了可扩展性

4.函数式:
在纯函数式中函数是头等值
· 函数本身是一个值,可以作为参数,也可以作为结果返回或者保存在变量中,匿名函数可以更好的混入到代码中    
  #简化了控制结构的创建
  #代码更加清晰,易读
 #程序的扩展性变得更好(将变化隐藏到函数中)
· 程序的操作更应该是从输入映射到输出而不是就地更改数据(方法不应该有副作用-->在其作用域的交流就是获得参数和返回结果)
 #不可变的数据结构
 #指称透明:对于任何输入来说,都可以用方法的结果替代对它的调用,而不影响程序的语义


从语言的设计层面的视角:表达式与函数的概念
· 函数是从输入到输出的映射,在映射的过程我们需要用到表达式或语句来实现我们的输出




5.扩展性:
在scala中,所有的东西都是基于库模块(库抽象,可以扩展或改造),可以依照需要选择和修改
· 抽象使得我们能更好的改造及扩展我们的代码
· 库模块:以更高级别的抽象来定义了API
· scala可以通过帮助提升接口的抽象级别来帮助管理的复杂性

核心:面向对象与函数式编程思想的融合

问题:
· 可扩展性受到从语法细节到控件的抽象构造等许多因素的影响?

表现:
scala允许用户通过定义感觉像原生语言支持一样的易用库在他们需要的方向上发展和改造语言
· 我们可以构建自己的内建类型
· 我们可以构建自己的控制结构


在scala中函数就是对象,函数类型是能够被子类继承的类


6.兼容性:
scala的隐式转换特性:在定义类型匹配和或选用不存在的方法时,使用隐式转换

7.简洁性:
· scala中省略了一些语法和类型推断
· scala包含了更强有力的工具,以便抽取和提炼通用行为

8.高级性:
· scala可以帮助提升接口的抽象级别来帮助管理复杂性
· 自定义抽象控制结构:减少代码的重叠保持程序的简短和清晰

9.静态类型:
· 静态类型系统可以需要保存和计算的值的类型来认定变量和表达式的类型(编译的时候就确定了类型)
· 通过类型推断避免了冗余性及通过模式匹配和一些新的编写和组织类型的办法获得了灵活性
程序抽象:
#可检验属性:保证消除某些运行时的错误
#安全的重构:
#文档:类型推断:用精妙的类型去适应灵活使用的模式


10.类型系统:
 

© 著作权归作者所有

wiitht
粉丝 3
博文 158
码字总数 113941
作品 0
深圳
架构师
私信 提问
从 Java 到 Scala (三): object 的应用

本文由 Captain 发表在 ScalaCool 团队博客。 在上篇 Java 到 Scala 系列中,我想你或多或少在语言特性上对有了一定的掌握,在了解完它酷酷的语言特性——让静态回归常态并能简单运用其衍生出...

ScalaCool
2018/09/10
0
0
2015总结暨2016展望

2015已过去,2016到来。展望未来也总结过去。 2015 2015年到了一家新的公司,是一家做大数据服务的创业公司(准备说是2014年底)。刚到公司时我们只有几人,到现在已经成为一家50人左右的中小...

羊八井
2016/01/07
105
2
给 Java 说句公道话

编者注:本文来自博客 yinwang.org ,并不代表本站观点。 有些人问我,在现有的语言里面,有什么好的推荐?我说:“Java。” 他们很惊讶:“什么?Java!” 所以我现在来解释一下。 Java超越...

oschina
2016/02/11
12.8K
135
Scala 2.8 Beta 1发布

今天,万众期待的Scala 2.8 Beta1终 于发布了。 相比于2.7.7版,新版本修复了大量bug,同时增加了很多新特性。该Beta版将成为几个月后发布的2.8.0正式版的基 础。 小版本号的增长(相对于2.7...

红薯
2010/01/31
284
0
Scala 的学习笔记系列(持续更新中)

最近学习 Scala,因它是灵活的函数式编程,还有就是能为 PlayFramework 2.0 服务,看的是 《Programming in Scala》 那本书,并记下自己认为值得记录的东西,列举 Scala 用元组/列表类型实现...

YanbinQ
2012/10/26
0
1

没有更多内容

加载失败,请刷新页面

加载更多

浅谈 Spark 的多语言支持

作者:郑锴,花名铁杰,阿里巴巴高级技术专家,Apache Hadoop PMC,Apache Kerby 创立者。深耕分布式系统开发和开源大数据多年,先后专注在安全,存储和计算领域。之前在 Intel,目前转战阿里...

阿里云云栖社区
19分钟前
2
0
Linux运维常见的硬件及系统问题

一、服务器常见故障和现象 1、有关服务器无法启动的主要原因 : ①市电或电源线故障(断电或接触不良) ②电源或电源模组故障 ③内存故障(一般伴有报警声) ④CPU故障(一般也会有报警声) ⑤主板故...

寰宇01
26分钟前
0
0
Confluence 6 针对 'unmigrated-wiki-markup' 宏重新尝试合并

在签名的章节中,我们主要是针对没有完全合并完成余下的为合并内容的异常处理。最常见的情况是内容以及被合并了,但是页面使用 wiki 标记的内容没有被合并,通常这些 wiki 标记的内容使用了 ...

honeymoose
36分钟前
2
0
ubuntu 18.04桌面版启动错误: Unable to mount root fs on unknown-block(0,0)

问题出现过程 *** 我的环境: visualbox 虚拟机 Ubuntu 18.04 桌面版 IP:192.168.1.186 (最初从 192.168.1.185 克隆过来的) 20190423 晚上准备安装一个 UNlet standalone 和 一个 Eclips...

wwzzhh166
37分钟前
1
0
fescar select for update 读隔离级别实现

/* * Copyright 1999-2018 Alibaba Group Holding Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in complian......

xiaomin0322
40分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部