美文网首页
Scala学习笔记 A2/L1篇 - 操作符Operators

Scala学习笔记 A2/L1篇 - 操作符Operators

作者: hakase_nano | 来源:发表于2018-08-10 18:27 被阅读0次

教材:快学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方法

相关文章

网友评论

      本文标题:Scala学习笔记 A2/L1篇 - 操作符Operators

      本文链接:https://www.haomeiwen.com/subject/meslbftx.html