Chapter11
package scala import scala.collection.mutable /**
* Created by EX-CHENZECHAO001 on 2018-04-03.
*/
class Chapter11 { }
object Chapter11 { // 标识符由字母、数字或运算符构成
// 一元和二元操作符其实是方法调用
// 操作符优先级取决于第一个字符,而结合性取决于最后一个字符
// apply和update方法在对expr(args)表达式求值时被调用
// 提取器从输入中提取元组或值的序列 // 11.1 标识符
// 变量、函数、类等的名称统称为标识符
// 可以在反引号中包含几乎任何字符序列
val `val` = 42 // 11.2 中置操作符
1 to 10
1.to(10) // 等同
1 -> 10
1.->(10) // 等同 // 11.3 一元操作符
// 中置操作符是二元的,它们有两个参数。只有一个参数的操作符称为一元操作符。如果参数在后,则为后置操作符
1 toString()
1.toString() // 等同
// + - ! ~ 可以作为前置(prefix)操作符,出现在参数之前。它们被转换成对名为unary_操作符的方法调用
-1
1.unary_- // 等同 // 11.4 赋值操作符
// 赋值操作符的名称形式为操作符=
var a = 0
var b = 1
a -= b
a = a - b // 等同
// <= >= != 不是赋值操作符
// 以=开头的操作符不是赋值操作符(== === =/=等)
// 如果a有一个名为操作符=的方法,那么该方法会被直接调用 // 11.5 优先级
// 除赋值操作符外,优先级由操作符的首字符决定
// 后置操作符的优先级低于中置操作符 // 11.6 结合性
// 操作符的结合性决定了它们是从左到右求值还是从右到左求值。
// 在Scala中所有操作符都是左结合的,除了
// 1.以冒号结尾的操作符
// 2.赋值操作符
// 3. 用户于构造列表的::操作符是右结合的,1 :: 2 :: Nil 等同 1 :: (2 :: Nil) // 2 :: Nil 等同 Nil.::(2) // 11.7 apply和update方法
val scores = new mutable.HashMap[String, Int]()
scores("Bob") = 100 // 调用 scores.upldate("Bob", 100)
val bobsScore = scores("Bob") // 调用scores.apply("Bob") class Fraction1107(n: Int, d: Int){ }
object Fraction1107 {
def apply(n: Int, d: Int) = new Fraction1107(n,d)
}
// 因为有apply方法,可以直接用Fraction1107(3,4)构造对象,而不用 new Fraction1107(3,4) // 11.8 提取器
// 提取器就是一个带unapply方法的对象
// 可以把unapply方法当做是伴生对象中apply方法的反向操作
// apply方法接受构造参数,然后将它们变成对象
// unapply方法接受一个对象,然后从中提取值,这些值就是当初用来构造对象的值
class Fraction(val num: Int, val den: String){
}
object Fraction {
def unapply(input: Fraction): Unit = {
if(input.den == 0) {
None
}else{
Some((input.num, input.den))
}
}
}
// 从字符串中提取名字和姓氏
class Name(val first: String, val last: String) { }
object Name {
def unapply(input: String) = {
val words = input.split("\\s+")
if(words.length != 2) {
None
}else{
Some((words(0)),(words(1)))
}
}
}
val author = "Cay Horstmann"
val Name(first, last) = author
// 每个样例类都自动具备apply和unapply方法 // 11.9 带单个参数或无参数的提取器
// 在Scala中没有只带一个组件的无组。如果upapply方法要提取单值,则应该返回一个目标类型的Option
object Number {
def unapply(input: String): Option[Int] = {
try{
Some(Integer.parseInt(input.trim))
} catch {
case ex: NumberFormatException => None
}
}
}
val Number(n) = "1729" // 测试输入,返回Boolean
object IsCompound {
def unapply(input: String) = input.contains(" ")
}
// author match {
// case Name(first, last @ IsCompound) => println("isCompound")
// } // 11.10 unapplySeq方法
// 要提取任意长度的值的序列,需用unapplySeq,返回一个Options[Seq[A]] ,其中A是被提取的值的类型
object Name1110 {
def unapplySeq(input: String): Option[Seq[String]] = {
if(input.trim == ""){
None
} else {
Some(input.trim.split("\\s+"))
}
}
}
author match {
case Name(first, last) => println("2")
} }
Chapter11的更多相关文章
- 【APUE】Chapter11 Threads
看完了APUE第三版的Chapter11 Threads,跟着书上的demo走了一遍,并且参考了这个blog(http://www.cnblogs.com/chuyuhuashi/p/4447817. ...
- JavaWeb chapter11 编写无脚本的JSP页面
1. JSP表达式语言EL 使用jsp:getProperty的property属性只能访问Bean的属性,不能访问嵌套的属性. JSP EL(表达式语言 Expression Language), ...
- Java系列:《Java核心技术 卷一》学习笔记,chapter11 记录日志
11.5 日志记录 可以通过Loger.getGlobal().info(xxxx);的方式来记录log. 11.5.2 高级日志 1)通过一个包名来 创建一个新的日志记录器. private sta ...
- Chapter11:关联容器
当用decltype来获得一个函数指针类型时,必须加上一个*来指出我们要使用一个给定函数类型的指针.decltype<CompareIsbn>*. map<string, int&g ...
- 《es6标准入门》chapter11中关于Proxy的一个错误例子的纠正
在原书第二版的p120,这里有一个使用Proxy实现管道化调用的例子,想法很好,但是代码有问题,下面是更正之后的代码. 由于我是在node环境下运行,所以我把几个全局函数定义到global内了,如果是 ...
- 《鸟哥的Linux私房菜》Chapter11 20180726~20180806
目录 1.认识Bash这个shell 1.1.硬件.核心与shell 1.2.系统的合法shell和/etc/shells功能 1.3.Bash shell的功能 1.3.1.命令修编功能 1.3.2 ...
- Chapter11(关联容器)--C++Prime笔记
1.关联容器: map关键字-值对,经常被称为关联数组 set中每个元素只有一个关键字,即只保存关键字的容器 ①允许重复的关键字的容器名字都包含multi. ②不保持关键字顺序存储的容器的名字都以但粗 ...
- [SharePoint][SharePoint Designer 入门经典]Chapter11 工作流基础
1.SPS中可以创建的工作流的种类 2.SPD工作流基础 3.创建列表\库工作流 4.创建可重用的工作流 5.利用基于站点的工作流 6.SPD 工作流的限制和注意事项
- Matlab 从入门到精通 Chapter11 文件读取I/O
11.1 工作空间数据读取 将工作空间的变量保存为文件,可以使用save命令. save('filename') 将文件保存在当前目录下,文件名为filename.mat save('filenam ...
随机推荐
- 使用UIVisualEffectView创建毛玻璃效果
UIVisuaEffectView :继承自UIView,可以看成是专门用于处理毛玻璃效果的视图,只要我们将这个特殊的View添加到其他视图(eg. ImageView )上面,被该UIVisuaEf ...
- cmd命令,输出为txt文本
在命令行后面,加上'-t > d:output.txt'. 具体可参考如下图: //=====补充===== 所以,在调试nodejs的时候,如果用命令行调试,则可把输出信息都重定向到一个文件中 ...
- POJ3630(Trie树)
Phone List Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 26385 Accepted: 7957 Descr ...
- 问题5:如何快速找到多个字典中的公共键(key)
方法一:for in循环 from random import randint, sample a1 = {k; randint(1, 4) for k in 'abcdefg'} a2 = {k; ...
- keil5编译时出现 MDK-Pro middleware is not allowed with this license
转载请注明出处:http://blog.csdn.net/qq_26093511/article/details/51700961 最近在用MDK编译一个别人的工程时,有如上提示: 1.原因是没有注册 ...
- Spring Boot 专栏
http://blog.csdn.net/column/details/spring-boot.html?&page=2
- 6.6 安装IDEA
非常感谢Kevin指导.让我简化了安装步骤.安装包可以直接到我的公司文件夹中sunny文件夹中获取. 首先准备好安装包: 然后打开终端: 解压,进入bin目录,执行idea.sh;或者,直接运行: b ...
- 在Android中使用FlatBuffers(上篇)
本文来自网易云社区. 总览 先来看一下 FlatBuffers 项目已经为我们提供了什么,而我们在将 FlatBuffers 用到我们的项目中时又需要做什么的整体流程.如下图: 在使用 FlatBuf ...
- JSONCPP开发环境搭建
环境设置 项目地址 https://github.com/open-source-parsers/jsoncpp.git 操作系统 64位 Fedora 24 安装jsoncpp $ git clon ...
- Python中的变量,数据类型
Python中变量的命名规则:以字母和下划线开头,由字母,数字和下划线组成,区分大小写 Python中同样有加减乘除取余运算,还有一个运算符**,相当与幂运算,当然,幂运算的优先级要高于加减乘除 最后 ...