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》


  • 相关阅读:
    UVA 11925 Generating Permutations 生成排列 (序列)
    UVA 1611 Crane 起重机 (子问题)
    UVA 11572 Unique snowflakes (滑窗)
    UVA 177 PaperFolding 折纸痕 (分形,递归)
    UVA 11491 Erasing and Winning 奖品的价值 (贪心)
    UVA1610 PartyGame 聚会游戏(细节题)
    UVA 1149 Bin Packing 装箱(贪心)
    topcpder SRM 664 div2 A,B,C BearCheats , BearPlays equalPiles , BearSorts (映射)
    UVA 1442 Cave 洞穴 (贪心+扫描)
    UVA 1609 Foul Play 不公平竞赛 (构(luan)造(gao)+递归)
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/4070990.html
Copyright © 2011-2022 走看看