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的更多相关文章

  1. 【APUE】Chapter11 Threads

    看完了APUE第三版的Chapter11 Threads,跟着书上的demo走了一遍,并且参考了这个blog(http://www.cnblogs.com/chuyuhuashi/p/4447817. ...

  2. JavaWeb chapter11 编写无脚本的JSP页面

    1.  JSP表达式语言EL 使用jsp:getProperty的property属性只能访问Bean的属性,不能访问嵌套的属性. JSP EL(表达式语言 Expression Language), ...

  3. Java系列:《Java核心技术 卷一》学习笔记,chapter11 记录日志

    11.5 日志记录 可以通过Loger.getGlobal().info(xxxx);的方式来记录log. 11.5.2 高级日志 1)通过一个包名来 创建一个新的日志记录器. private sta ...

  4. Chapter11:关联容器

    当用decltype来获得一个函数指针类型时,必须加上一个*来指出我们要使用一个给定函数类型的指针.decltype<CompareIsbn>*. map<string, int&g ...

  5. 《es6标准入门》chapter11中关于Proxy的一个错误例子的纠正

    在原书第二版的p120,这里有一个使用Proxy实现管道化调用的例子,想法很好,但是代码有问题,下面是更正之后的代码. 由于我是在node环境下运行,所以我把几个全局函数定义到global内了,如果是 ...

  6. 《鸟哥的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 ...

  7. Chapter11(关联容器)--C++Prime笔记

    1.关联容器: map关键字-值对,经常被称为关联数组 set中每个元素只有一个关键字,即只保存关键字的容器 ①允许重复的关键字的容器名字都包含multi. ②不保持关键字顺序存储的容器的名字都以但粗 ...

  8. [SharePoint][SharePoint Designer 入门经典]Chapter11 工作流基础

    1.SPS中可以创建的工作流的种类 2.SPD工作流基础 3.创建列表\库工作流 4.创建可重用的工作流 5.利用基于站点的工作流 6.SPD 工作流的限制和注意事项

  9. Matlab 从入门到精通 Chapter11 文件读取I/O

    11.1 工作空间数据读取 将工作空间的变量保存为文件,可以使用save命令.  save('filename') 将文件保存在当前目录下,文件名为filename.mat save('filenam ...

随机推荐

  1. bzoj 4822~4824 CQOI2017题解

    老C的任务 题目大意: 维护一个二维平面,初始给出一些点及其权.多次询问某个矩形内的权和. n,m <= 100000 题解: 签到题. CDQ水一水. #include <cstdio& ...

  2. bzoj 2178 圆的面积并 —— 辛普森积分

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2178 先看到这篇博客:https://www.cnblogs.com/heisenberg- ...

  3. Poj 1458 Common Subsequence(LCS)

    一.Description A subsequence of a given sequence is the given sequence with some elements (possible n ...

  4. AI:AI

    ylbtech-AI:AI 人工智能(Artificial Intelligence),英文缩写为AI.它是研究.开发用于模拟.延伸和扩展人的智能的理论.方法.技术及应用系统的一门新的技术科学. 人工 ...

  5. MySQL(介绍1)

    数据库(Database)是按照数据结构来组织.存储和管理数据的仓库: 也可以将数据存储在文件中,但是在文件中读写数据速度相对较慢. 在WEB应用方面MySQL是最好的RDBMS(Relational ...

  6. C#设计模式(8)——桥接模式

    一.概念 桥接模式即将抽象部分与实现部分脱耦,使它们可以独立变化. 二.模型 三.代码实现 // 客户端调用 // 类似Web应用程序 class Client { static void Main( ...

  7. NW.js将网站打包成桌面应用

    需求:已有一个网站,因为浏览器兼容性等问题,想自己封装一个浏览器,打开时固定打开这个网站,通过这样的封装,将网站变成桌面应用程序. 1. 下载并安装NW.js的最新稳定版本(NW.js) 2. 创建一 ...

  8. numpy.ones_like(a, dtype=None, order='K', subok=True)返回和原矩阵一样形状的1矩阵

    Return an array of ones with the same shape and type as a given array. Parameters: a : array_like Th ...

  9. 使用jpa报No query defined for that name错误

    今天使用jpa创建本地查询时出现Java.lang.IllegalArgumentException: No query defined for that name..... 一个很sb的问题,调用e ...

  10. ansible应用案例-一键安装flask

    一.添加主机 sudo vim /etc/ansible/hosts ------------------------------------------------------> [group ...