Chapter12 Scala操作符

1. 标识符

  • 变量名、函数名、类名等统称为标识符,scala可以使用任何字符来作标识符,比如 ()!#%&×+-/:<>=?@\^|~ 等。

  • 反引号中可以使用任何字符序列。

    val √ = scala.math.sqrt _
    √(2)
    val `val` = 42
    println(`val`)

2. 中置操作符

  • 操作符要接两个参数,分别位于操作符两边。

  • a 标识符 b 等价于 a.标识符(b)

    1 to 10
    等价于 1.to(10)

    1 -> 10
    等价于 1 .->(10) 

3. 一元操作符

  • 只有一个参数的操作符成为一元操作符,操作符的位置可能位于参数的前或后,所有有下面两种情况。

  • a 标识符 等价于 a.标识符()标识符 a 等价于 a.unary_标识符

    1 toString
    等价于 1.toString()

    val a = 42
    -a
    等价于 a.unary_-

4. 赋值操作符

  • 赋值操作符的形式为 操作符=,表达式是 a 操作符= b ,等价于 a = a 操作符 b
    a += 1
    等价于 a = a + 1
  • <=、>=、!=、==、===、=/= 等不是赋值操作符,

5. 优先级

  • 后置操作符优先级低于中置操作符,a 中置操作符 b 后置操作符 等价于 (a 中置操作符 b) 后置操作符

  • 符号优先级如下表所示:

    操作符优先级
    除下面字符以外的操作符1(最高)
    * / %2
    + -3
    :4
    < >5
    !=6
    &7
    ^8
    |9
    赋值操作符10(最低)

6. 结合性

  • Scala除冒号操作符赋值操作符右结合,所有其他操作符都是左结合
    // 构造列表List
    1 :: 2 :: Nil   // :: 右结合
    1 :: (2 :: Nil)
    (1 :: 2) :: Nil // 错误
  • 右结合的的第二个参数就是方法,比如 2::Nil 等价于 Nil.::(2)

7. apply和update方法

  • 函数或方法位于赋值语句的等号左侧,调用的是update方法,否则调用的apply方法
    val scores = new scala.collection.mutable.HashMap[String, Int]
    scores("Bob") = 100 
    等价于调用:scores.update("Bob", 100) 

    val bobsScore = scores("Bob")
    等价于调用:scores.apply("Bob")

8. 提取器unapply

  • 提取器:是一个带有unapply方法的对象,可以当做是伴生对象apply的方法的反操作。

  • unapply接受一个对象,从中提取值。

    class Fraction(n: Int, d: Int) {
      private val num: Int = if (d == 0) 1 else n;
      private val den: Int = if (d == 0) 0 else d;
      def *(other: Fraction) = new Fraction(num * other.num, den * other.den)
    }

    // unapply返回的就是构造该对象的两个值
    object Fraction {
      def apply(n: Int, d: Int) = new Fraction(n, d)
      def unapply(input: Fraction) =
        if (input.den == 0) None else Some((input.num, input.den))
    }

    object Main extends App {  
      var Fraction(a, b) = Fraction(3, 4) * Fraction(2, 5)
      println(a)
      println(b)
    }
  • 每个样例类都会自动具备apply方法和unapply方法,样例类后面章节会讲解,这里只要了解就可以。

  • 提取器可以只测试输入而不真正将其值提取出来,只返回一个Boolean。


9. unapplySeq方法

  • 使用unapplySeq方法可以提取任意长度的值序列,它返回一个Option[Seq[A]],A是被提取的类型
    // Name 提取器可以产生所有组成部分的序列
    // 关于 Option,Some,None后面章节会详细讲解,这里只需了解upapplySeq的作用就可以。
    object Name {
      def unapplySeq(input: String): Option[Seq[String]] =
        if (input.trim == "") None else Some(input.trim.split("\\s+"))
    }

【待续】

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值