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")
} }
05-26 09:14