Kotlin研发第二十弹——运算符重载

26 篇文章 0 订阅
25 篇文章 0 订阅

运算符重载

  • 运算符重载
    • 转换
      • 一元运算符
      • 二元操作符
    • 函数命名的中缀调用

运算符重载

Kotlin允许我们事先一些我们自定义类型的运算符实现,这些运算符有固定的表示和固定的优先级。为实现这样的运算符,饿哦们提供了固定名字的数字函数和扩展函数。比如二元运算符的左值和一元运算符的参数类型

转换

一元运算符

表达式转换
+aa.pluns()
-aa.minus()
!aa.not()

决定a的类型,假设为T

寻找接受者是T的无参函数plus(),比如数字函数或者扩展函数

如果这样的函数缺失或不明确,则返回错误

如果函数是当前函数或返回类型是R则表达式+aR类型

注意这些操作符合其他的一样,都是被优化为基本类型并且不会产生多余的开销

表达式转换
a++a.inc()+see below
b–b.dex()+see below

这些操作符允许修改接收者和返回类型

编译器是这样解决有后缀的操作符的,如a++:

决定a的类型,假设T寻找无参函数inc(),作用在接收者T

如果返回类型是R必须是T的子类

计算表达式的效果是:

把a的初始值存储在a()中

把a.inc()的结果作用在a上

把a()作为表达式的返回值

a—、++a、—a 的步骤是一样的

二元操作符

表达式转换
a+ba.plus(b)
a-ba.minus(b)
a*ba.times(b)
a/ba.div(b)
a%ba.mod(b)
a…ba.rangeTo(b)

表达式只是解决了该表中翻译为列的表达式

表达式转换
a in bb.contains(a)
a !in b!b.contains(a)

in和!in的产生步骤是一样的,但是参数顺序是相反的

标志转换
a[i]a.get(i)
a[i,j]a.get(i,j)
a[i_1,…,i_n]a.get(i_1,…i_n)
a[i]=ba.set(i,b)
a[i,j]=ba.set(i,j,b)
a[i_1,…,i_n]=ba.set(i_1,…,o_n,b)

方括号被准换为get set函数

标志转换
a(i)a.invoke(i)
a(i,j)a.invoke(i,j)
a(i_1,…,i_n)A.invoke(i_1,…,i_n)

括号被准换为带有正确参数的invoke参数

表达式转换
a+=ba.plusAssign(b)
a-=ba.minusAssign(b)
a*=ba.timesAssign(b)
a/=ba.divAssign(b)
a%=bA.modAssign(b)

在分配a+=b时编译器是下面这样实现的:

右边列的函数是否可用

对应的二元函数是否也可用,不可用报告错误

确定它的返回值是Unit是否报告错误

生成a.plusAssign(b)

否则试着生成a=a+b代码

表达式转换
a==ba?.equals(b) ?: b.identityEquals(null)
a!=b!(a?.equals(b) ?: b.identityEquals(null))

注意=== 和!==是不允许重载的

==操作符有两点特别:
它被翻译成一个复杂的表达式,用于筛选空值,而且null==null是真

它需要带有特定签名的函数,而不仅仅是特定名称的函数,下面这样:

fun equals(other:Any?):Boolean

或者用相同的参数列表和返回类型的扩展功能

标志转换
a>ba.compareTo(b)>0
a<ba.compareTo(b)<0
a>=ba.compareTo(b)>=0
a<=ba.compareTo(b)<=0

所有的比较都转为compareTo的调用,这个函数需要返回Int

命名函数的中缀调用

函数用infix关键字标识的函数,叫中缀函数。

中缀函数必须符合以下几点:

必须是成员函数或者是扩展函数

必须只有一个参数

这个参数必须是可变参数类型,而且不能有默认值

必须使用infix关键字修饰

//中缀函数
infix fun String.add(str:String):String{
    return this+str
}

fun testInfix(){
    val xing="wang"
    val ming="yong"
    println("my name is ${xing add ming}")
}

输出

my name is wangyong
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值