Scala学习笔记
2016-07-08 21:31
239 查看
标识符
在定义标识符的时候,可以像java经典模式那样定义。当然,scala在选择标识符的时候有比java更多的选择,可以使用Unicode字符和以字母和下划线开头,你也可以使用任意序列的操作符字符。此外,我们还可以定义符号标识符,例如:val √ = scala.math.sqrt _
还有一个对于保留字符的定义的解决办法,我们可以利用反引号来实现对于关键字的定义方法。
val `val` = 42
这种方法可以标新立异,但是用起来易混淆,这样程序不宜读。
中置操作符
a 标识符 b其中标识符代表一个带有两个参数的方法(一个隐式的参数和一个显示的参数)。
例如:
1 to 10 等价于 1.to(10)
一元操作符
只有一个参数,比如:1 toString() 等价于 1.toString()如下四个操作符+、-、!、~可以作为前置(prefix)操作符,出现在参数之前。它们被转换成对名为unary_操作符的方法调用。例如:
-a 等价于 a.unary_-一样。
赋值操作符
a 操作符= b等同于:
a = a 操作符 b
需要注意:
<=、>=和!= 不是赋值操作符
以=开头的操作符不是赋值操作符
如果a有一个名为操作符=的方法,那么该方法会被直接调用。
结合性
在scala中,所有操作符都是左结合的,除了:- 以冒号(:)结尾的操作符
- 赋值操作符。
在scala中有一个很有用的操作符::,它是右结合的,用来构造列表。例如:
1::2::Nil
等价于
1::(2::Nil)
比如:
apply和update
apply方法经常用在伴生类对象中,用来构造对象而不是使用new显示地使用new,比如:class RichFile(val path : String) { } object RichFile{ def apply(path : String) : RichFile = { new RichFile(path) } }
在object中定义了apply方法,返回一个对象。
提取器
所谓提取器就是一个带有unapply方法的对象。它的返回值是一个Option,它包含一个元组,每个匹配到的变量各有一个值与之对应。还可以用它来进行模式匹配。
比如:
object RichFile{ def apply(path : String) : RichFile = { new RichFile(path) } def unapply(richFile: RichFile) = { if(richFile.path == null){ None }else{ val reg = "([/\\w+]+)/(\\w+)\\.(\\w+)".r//转换为正则表达式 val reg(r1,r2,r3) = richFile.path//这块相当于模式匹配 Some(r1,r2,r3) } } def main (args: Array[String] ) { val richFile = RichFile("/home/cay/readme.txt") val RichFile(r1,r2,r3) = richFile println(r1) println(r2) println(r3) } }
unapplySeq方法
主要用来提取任意长度值的序列,我们应该用unapplySeq来命名我们的方法。返回值为Option[Seq[A]],其中A是被提取值的类型。比如:
object RichFile2 { def apply(path: String): RichFile2 = new RichFile2(path) def unapplySeq(richFile2: RichFile2): Option[Seq[String]] = if(richFile2.path == null) None else{ Some(richFile2.path.split("/")) } def main(args: Array[String]) { val richFile = RichFile2("/home/cay/readme.txt") val RichFile2(r @ _*) = richFile println(r) } }
RichFile2提取出来组成路径的所有部分序列。
apply方法和unapply方法在scala中是比较重要的两个方法,提现了scala的一大特性。
相关文章推荐
- (巩固基础篇)排序算法:①插入排序②希尔排序③冒泡排序④选择排序⑤快速排序
- [Leetcode]121. Best Time to Buy and Sell Stock
- Hbase启动,警告Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=128m;
- Codeforces Round #336 (Div. 2) B 暴力
- Web 基础学习之 JS ,循环练习
- 链表倒数第n个节点
- 用MyEclipse10.0远程连接Mysql数据库服务器
- jQuery 架构分析
- UOJ #118. 【UR #8】赴京赶考
- C语言学习笔记_6编译预处理
- 对RadioGroup中的RadioButton设置颜色选择器
- TCP超时与重传
- JSONP(跨域请求) —— 一种非官方跨域数据交互协议
- MySQL Explain详解(转)
- 提高项目27.1-字符加密
- 【数据结构】AVLTree(高度平衡的二叉搜索树)
- UOJ #113. 【UER #2】手机的生产
- 操作系统内存管理——分区、页式、段式管理
- C语言中关于内存这个话题
- mysqldump原理1