Scala中的一些特性--Scala特性,可以从基本语言特征。面向对象特点、并发编程、函数式编程以及自身的特有地方构成。本次主要涉及自身的一些特点
模式匹配
隐式转换
类型系统
模式匹配
1.eg:
patteh match{
case 1 => println('1')
case_ => println("其他")
}
match语句匹配的对象,以及case语句加入表达式
case 后面接
常量 通常大写,若小写的常量需要使用反括号
变量 case x if(x%2==0) 必须以小写字母开头
类型 case x:String 类型多是大写 优先于isInstanceof asInstanceof
数组、元组、列表 case() Array
序列模式 Seq unapplySeq
可变参数类表的匹配
正则表达式的匹配
样例类的匹配-构造函数unapply-样例类case class等
变量绑定模式@
2.模式匹配的原理
匹配发生在运行期,Java虚拟机中的泛型类型信息会被擦除,所以不能用类型来匹配特定的Map类型
变量是如何绑定到列表或者元组的不同部分--
析构--访问复杂结构的各组成部分--
提取器机制 extractor --带有从对象中提取值的unapply或者unapplySeq方法-提取器就是一个带有 unapply 方法的对象
Array伴生对象
正则表达式--正则表达式对象
unapply方法会将对象分解为用以匹配模式的片段,而apply则是为了提供一个把他们组合回去的选择
每个样例类都自动具备apply和unapply方法
提取任意长度值的序列-unapplySeq
隐式转换
Scala中会默认隐式的引用到每个程序中-import Predef._ // 通过Predef对象自动加载一些隐式对象
隐式参数和隐式转换
隐式转换用于类型之间做转换 implicit conversion function
隐式转换规则--显性定义规则-作用域规则--无歧义规则
当表达式类型与预期类型不同时
当对象访问一个不存在的成员时
当对象调用某个方法,而该方法的参数声明与传入参数不匹配时
定义隐式转换函数
implicit def int2float(x:Int) :Float = x.toFloat
隐式转换与函数名无关--只与函数签名-即 输入参数类型和返回值类型有关
隐式类-隐式对象-隐式参数-隐式值
隐式参数适用的场景
执行上下文
功能控制
限定可用实例
隐式证据-- 绕开类型擦除带来的限制
隐式参数遵循的规则
只有最后一个参数列表中允许出现隐式参数
implicit 关键字必须出现在参数列表的最左边,且只能出现一次
类型系统 Type System
类型--类型参数 -- 类型变量
类型参数-
01.类型泛化-- 带有一个或者多个类型参数的类是泛型
泛型类-泛型函数
02.对类型做出限制 类型界定(上界、下界、上下文界定、类型约束),
类型约束: =:= <:< =>
变异声明 + -
协变表示某个泛型类的子类型关系 和参数T方向一致 -- 表示输出的类型参数 +
逆变表示方向相反 -- 表示输入的类型参数
03.类型通配符
高级类型
参数化类型- 抽象类型-结构化类型
单例类型-类型投影-类型别名- 结构类型-存在类型-抽象类型-高等 Higher-Kinded类型
高阶类型的使用中,有三种变化,分别是顺变、协变及逆变
高阶类型是接受其他参数用来构造新类型的,所以又称为“类型构造器
路径相关类型-- path-dependent type
类型推断
Scala采用的局部的(local)、基于流的(flow-based)类型推断
附录:
中置表达式-- infix- 中置操作符
操作符: 优先级和结合性(顺序)
一元操作符、二元操作符、三元操作符
前置操作符、中置操作符、后置操作符
功能: 赋值操作符
1 to 10 == 1.to(10)
方法
apply : 构造对象不用显示使用new
unapply
update
2. match case
catch(){ case e:Exception}
3.
Predef提供经常使用函数 println()
Predef对象定义了经常使用的隐式转换--一些隐式转换规则
Predef 定义了若干的类型以及类型别名
函数的签名(方法签名)是用来定义一个函数传入参数的类型,顺序和数量的
参考
Scala常见特性小结 http://ytluck.github.io/program/my-program-post-20.html