教材:快学Scala
chapter 11. 操作符 Operators
11.1 标识符:变量/函数/类等的名称
- 操作符字符:除
.,;'"
之外所有ASCII字符+Unicode字符
val 半径 = 3
val π = 3.1415926
val 周长 = 2 * π * 半径
周长: Double = 18.849555600000002
- 反引号``可用于访问Java内与关键字同名的方法:Thread.`yield`()
infix操作符 a 标识符 b
等价于 a.标识符(b)
(左结合的情况)
postfix操作符 a 标识符
等价于 a.标识符()
prefix操作符 标识符a
等价于 a.unary_标识符()
赋值操作符 a 操作符= b
等价于 a = a 操作符 b
定义操作符 def *(other: Fraction) = new Fraction(num * other.num, den * other.den)
- 除赋值操作符外,操作符的优先级取决于首字符
- 除了
:
结尾的和赋值操作符外,操作符的结合性都是左结合
e.g. 用于构造列表的::
操作符是右结合的
1 :: 2 :: Nil
意思是1 :: (2 :: Nil)
2 :: Nil
等价于Nil.::(2)
11.7 apply和update方法
如果f不是函数也不是方法,则
f(x1, x2)
等价于 f.apply(x1, x2)
f(x1, x2) = value
等价于 f.update(x1, x2, value)
e.g. HashMap用到了apply和update
val scores = new scala.collection.mutable.HashMap[String, Int]
scores("Bob") = 100 // scores.update("Bob", 100)
val bs = scores("Bob") // scores.apply("Bob")
- apply一大用途:定义在companion object里用来构造对象而不用显式new对象
class Fraction(n: Int, d: Int) {...}
object Fraction {
def apply(n: Int, d: Int) = new Fraction(n, d)
}
val res = Fraction(3, 4) * Fraction(2, 5)
11.8 提取器 == 带unapply方法的对象
-
apply
:接受构造参数,然后变成对象 -
unapply
:接受一个对象,然后从中提取值,返回一个Option
class Fraction(n: Int, d: Int) {...}
object Fraction {
def unapply(input: Fraction) =
if (input.den == 0) None else Some((input.num, input.den))
}
val Fraction(a, b) = Fraction(3, 4) * Fraction(2, 5) // a = 6, b = 20
object Name {
def unapply(input: String) = {
val pos = input.indexOf(" ")
if (pos == -1) None
else Some((input.substring(0, pos), input.substring(pos+1)))
}
}
val author = "Cay Horstmann"
val Name(first, last) = author
- 每一个case class都自动具备apply和unapply方法
网友评论