scala 操作符的优先级如下所示,从高到低依次为:
(所有其他特殊字符)
* / %
+ -
:
= !
< >
&
^
(所有字母)
(所有赋值操作符)
以上操作符在同一级别时,优先级是一样的,按照从左到右顺序计算,比如2 +8 -9%3的计算顺序为(9%3) -> 2+8 ->(2+8) - (9%3)。以上显示了出操作方法符的“ 首字符 ”的优先级顺序,用自定义的方法的优先级如何计算?取自定义方法的首字符,然后按照上表的顺序,该字符在上表中的优先级越高,则该自定义操作符就拥有更高的优先级,例如:2 << 2 +2,因为 <的上表排名在+之后,所以<<优先级比 +低,计算顺序为2 << (2+2)。
1)上述规则有一个例外:以=结尾的操作符,而且不是<= 、>=、==、!=这四个时,不管首字母是什么,它的优先级都是和=赋值优先级一样,是最低的,例如:x *= y+1和x *= (y+1)操作顺序是一样
2)操作符优先级只比较首字符,首字符相同的自定义操作符的优先级是一样的,比如*--和**-的优先级是一样的;当多个同等优先级的操作符并排在一起时,操作符的结合决定了操作符的分组,操作符的结合性由操作符的最后一个字母决定:任何以:字符结尾的操作符或方法都是在它的右侧操作对象上调用,左侧是传入的参数;而任何其他的、非:字符结尾的操作符或方法都是在它的左侧操作对象上调用右侧是传入的参数,例如:
a*b 就是等效为 a.*(b),即*左侧的对象a调用它自己的方法*,方法的入口参数是右侧的b
a ::: b则等效为b.:::(a),即:::右侧的对象b调用它自己的方法:::,方法的入口参数是左侧的a
scala的基础类(比如Int ),可以通过隐式转化为"富包装类"(比如RichInt),从而可以调用更多的方法函数,隐式转化是用implicity定义的一种方法,scala会自动匹配相应的隐式转化,把一个类对象转化为另一种类对象,这种转化是在需要时自动完成的,因而叫"隐式转化",是一种非常强大的功能。
视频讲解1:操作符优先级和自定义操作符优先级
视频讲解2:类重载、隐式转化
往期推荐