Scala运算符

文章介绍了Scala语言中运算符实际上等同于方法的概念,包括单参、多参和无参方法的不同调用方式。运算符分为中缀、前缀和后缀三种类型,分别举例说明其用法。同时,文章强调了运算符优先级的重要性,解释了如何通过优先级解决表达式求值的问题,并提供了运算优先级表作为参考。
摘要由CSDN通过智能技术生成

一、运算符等价于方法

(一)运算符即方法

(二)方法即运算符

1、单参方法

 - val str = "international"
 - val x1 = str.indexOf('a')
 - val x2 = str indexOf 'a'
  • str.indexOf(‘a’) 与 str indexOf ‘a’ 是等价的
    在这里插入图片描述

2、多参方法


 - val str = "international"
 - val x3 = str.substring(2, 4)
 - val x4 = str substring (2, 4) // 如果参数有多个,需要用小括号包起来
  • str.substring(2, 4) 与str substring (2, 4)是等价的
    在这里插入图片描述

3、无参方法


 - val str = "international"
 - val x5 = str.toUpperCase()
 - val x6 = str.toUpperCase // 方法调用时如果不需要传入任何参数,小括号可以省略
 - val x7 = str toUpperCase // 这种写法,如果没有参数,则括号不用写
  • 注意:使用后缀运算符toUpperCase之前必须导入scala.language.postfixOps类,否则会报错

 1. import scala.language.postfixOps
 2. val str = "international"
 3. val x5 = str.toUpperCase()
 4. val x6 = str.toUpperCase // 方法调用时如果不需要传入任何参数,小括号可以省略
 5. val x7 = str toUpperCase // 这种写法,如果没有参数,则括号不用写

在这里插入图片描述

二、运算符种类

(一)中缀运算符(Infix Operator)

  • 运算符符在两个操作数之间,2 + 3 等同于2.+(3)
    在这里插入图片描述

(二)前缀运算符(Prefix Operator)

  • 运算符在唯一的操作数之前 :-1、+3、 ~0xFF、!false

  • -1等同于1.unary_-,前缀运算符如同中缀运算符一样,也是方法调用的另一种方式,不同的是,方法名要在符号前加上前缀unary_ 。

  • 在这里插入图片描述

  • 能作为前缀运算符的运算符只有+、-、!、~四种。如果你自己定义了unary_!方法就可以使用!前缀运算符来调用方法了,但是即使你定义了unary_*,也不能用来调用该方法,因为不是四种可用的前缀运算符之一。
    在这里插入图片描述

(三)后缀运算符(Postfix Operator)

  • 运算符在唯一的操作数之后str toUpperCase 等同于 str.toUpperCase(),后缀运算符不用点或括号调用无参方法。在Scala里,方法调用的空括号可以省略,但是如果去掉括号可能造成副作用就带上括号。
    在这里插入图片描述

三、运算符优先级

(一)简单说明

  • 由于Scala并没有真正的运算符,运算符其实是方法的一种形式,所以此处运算符的优先级,其实就是指方法的优先级。在Scala中方法的执行是有优先级的区别的,这也是为了解决传统运算符优先级问题。

  • 例如:3 + 2 * 5,我们期望获得的是13,但是根据Scala特点,Scala中所有运算符其实就是方法,那么按照这种说法,表达式应该等同于(3).+(2) 得到5,(5).*(5) 得到25,与我们的预期不符!Scala如何解决此问题呢?靠的是运算符优先级。
    在这里插入图片描述

(二)运算优先级表

在这里插入图片描述

[https://howard2005.blog.csdn.net/article/details/129120352?spm=1001.2014.3001.5502]

  • 如果运算符以=结尾,且运算符并非比较运算符 <=、>=、==或=,则运算符优先级等同于=,即优先级最低,例如+=、-=等;同级别优先级从左到右统计;可以使用括号改变优先级,这是个好习惯,特别是在Scala这种可能过于简洁的语言中。
  • 特殊情况:以:字符结尾的方法由它的右操作数调用,并传入左操作数,以其它字符结尾的方法与之相反。a :: b 对应的是 (b).::(a) 而不是 (a).::(b)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值