zoukankan      html  css  js  c++  java
  • 探索Scala(1)-- 运算符重载

    Scala语言运算符重载全然是语法层面的小把戏,本文记录我对Scala语言运算符重载的一些理解。

    方法调用语法糖

    调用方法时,Scala同意省略点号圆括号,如以下代码所看到的:


    把运算符映射成单词

    对于Scala来说,运算符和普通的方法没什么两样。比方以下这个类就重载了加号减号


    我们能够这样使用MyInt:

    var myInt = new MyInt(1)
    myInt = myInt + 1
    javap或者classpy分析一下scalac编译之后的类能够知道,+实际上被编译成了$plus()方法,-被编译成了$minus()方法。也就是说,以下三行代码全然等价:

    myInt = myInt + 1
    myInt = myInt.+(1)
    myInt = myInt.$plus(1)

    多符号运算符

    多符号运算符无非就是单个运算符的简单组合而已,给MyInt加入一个多符号运算符+++,例如以下所看到的:

    那么能够这样使用+++:

    var myInt = new MyInt(1)
    myInt = myInt +++ 1

    反编译MyInt.class能够知道,scalac把+++运算符编译成了$plus$plus$plus()方法。

    op=语法糖

    假设一个类重载了op运算符,可是没有重载op=,那么Scala编译器会把x op= y替换为x = x op y,也就是x = x.op(y),代码例如以下所看到的:

    var myInt = new MyInt(1)
    myInt += 1 // myInt = myInt + 1

    绑定规则

    假设运算符以冒号结束,那么运算符会绑定(bind)到右边的操作数,也就是说,x op: y等价于y.op:(x)。我们给MyInt添加一个+:运算符,例如以下所看到的:


    那么能够这样使用+:运算符:

    var myInt = new MyInt(1)
    println(1 +: myInt) // myInt.+:(1)
    


    一元运算符

    仅仅有四种运算符能够被定义为一元(Unary)运算符,它们是:+、-、!、~,如以下代码所看到的:

    以下是演示样例代码:

    val myInt = new MyInt(1)
    println(-myInt) // -1
    println(!myInt) // 99
    println(~myInt)
    

    圆括号语法糖

    假设一个类定义了apply()方法,那么Scala提供了语法糖,让该类的实例看起来像是函数(能够直接调用)或数组(能够按下标訪问元素)。假设类定义了update()方法,那么就能够像数组那样按下标赋值。比方以下的Pair类:


    能够像以下这样使用Pair类:

    val xy = new Pair(Array(3, 7))
    println(xy(0)) // 3
    println(xy(1)) // 7
    
    xy(0) = 11
    xy(1) = 18
    println(xy(0)) // 11
    println(xy(1)) // 18
    

    运算符对比表

    以下是我整理出来的运算符和Scala内部名称的对比表:

    + $plus
    - $minus
    * $times
    / $div
    % $percent
    & $amp
    | $bar
    ^ $up
    ~ $tilde
    > $greater
    < $less
    ! $bang
    ? $qmark
    = $eq
    : $colon
    @ $at
    # $hash
    $bslash
    $ $

    參考资料

    http://www.scala-lang.org/documentation/

    http://stackoverflow.com/questions/7888944/scala-punctuation-aka-symbols-and-operators

    《Programming in Scala》第二版

    《Scala for the Impatient》


  • 相关阅读:
    关于might_sleep的一点说明---CONFIG_DEBUG_ATOMIC_SLEEP【转】
    让你的软件飞起来:RGB转为YUV【转】
    Linux终端彩色打印+终端进度条【转】
    Linux中实现一个简单的进度条【转】
    Linux内核官方文档atomic_ops.txt【摘自Linux 内核文档】
    Linux 内核链表的使用及深入分析【转】
    Linux2.6.32内核笔记(5)在应用程序中移植使用内核链表【转】
    spin_lock & mutex_lock的区别? 【转】
    Linux c括号作用域【原创笔记】
    linux C 中的volatile使用【转】
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/4070990.html
Copyright © 2011-2022 走看看