Kotlin操作符重载:把标准操作加入到任何类中(KAD 17)
时间:Mar 21, 2017
原文链接:https://antonioleiva.com/operator-overload-kotlin/

就像其他每种语言一样,在Kotlin中,已经预定义了一些操作符执行一定的操作。
最典型的是加(+),减(-),乘(*),除(/),而且还有很多。
类似Java这样的一些语言,这些操作符被限制在一些特定的数量类型上,且没有方法让其他类型数据使用这些操作符。
还有在像Scala这样的其他语言中,由于函数名称可接受任何符号,我们就可创造能用于任何数据类型操作符。
Kotlin的这种方案:有一些预定义的操作符,而我们能够为任意数据类型重载它们。
Kotlin的操作符重载
如我们讨论的,Kotlin能够重载一些操作符,在我们的类中实现其相应的函数。这些函数前必须加上保留字operator。
这些基本操作符如下:
一元操作符
|
+a |
a.unaryPlus() |
|
-a |
a.unaryMinus() |
|
!a |
a.not() |
|
a++ |
a.inc() |
|
a– |
a.dec() |
二元操作符
|
a + b |
a.plus(b) |
|
a – b |
a.minus(b) |
|
a * b |
a.times(b) |
|
a / b |
a.div(b) |
|
a % b |
a.mod(b) |
|
a..b |
a.rangeTo(b) |
|
a in b |
b.contains(a) |
|
a !in b |
!b.contains(a) |
|
a += b |
a.plusAssign(b) |
|
a -= b |
a.minusAssign(b) |
|
a *= b |
a.timesAssign(b) |
|
a /= b |
a.divAssign(b) |
|
a %= b |
a.modAssign(b) |
数组类型操作符
|
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] = b |
a.set(i, b) |
|
a[i, j] = b |
a.set(i, j, b) |
|
a[i_1, …, i_n] = b |
a.set(i_1, …, i_n, b) |
等式(equals)操作符
|
a == b |
a?.equals(b) ?: b === null |
|
a != b |
!(a?.equals(b) ?: b === null) |
由于equals操作使用更复杂地转换做正确性检查,并且期望函数准确说明而不仅仅是为它的一个特殊名称,而稍有一点不同略有不同。
fun equals(other: Any?): Boolean
激活(invoking)函数
|
a(i) |
a.invoke(i) |
|
a(i, j) |
a.invoke(i, j) |
|
a(i_1, …, i_n) |
a.invoke(i_1, …, i_n) |
例子
假设你有公司数据模型,每位雇员的列表。
你可以使用get操作符访问方括号中位置。这种实现非常容易:
class Employee(val id: Long, val name: String)
class Company(private val employees: List) {
operator fun get(pos: Int) = employees[pos]
}
这样你就可以使用它:
val company = Company(listOf(Employee(1235, "John"), Employee(2584, "Mike")))
val mike = company[1]
而你也是能够超于它,并用ID来恢复值,实现这样的功能:
operator fun get(id: Long) = employees.first { it.id == id }
val mike = company[2584]
结论
操作符能够帮助我们为使用通用符号表达已知操作提升可读性。
小心不要在会导致读者混淆的情况下使用它们,它们能够成为一个非常有趣的工具
如果您还不知道怎样做,我建议你获取免费指南,学习怎样创建您的第一个项目,或是直接获取这本书,学习怎样从零开始创建一个完整的应用程序。
a.unaryMinus()
Kotlin操作符重载:把标准操作加入到任何类中(KAD 17)的更多相关文章
- MFC--串口编程---WIN API的方式将串扣操作封装在线程类中
串口采集数据 本文档介绍的是如何获取串口原始数据并将原始数据解析成可处理或可展示的数据. 一.串口采集有很多方式: 1).MFC有一个专门的控件,直接编程采集,一个控件只能采集一个串口,而且串口名字比 ...
- 将Java连接数据库操作封装到MySQL类中
public class MySQL { final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver"; final String D ...
- C++ 友元(friend关键字)、类中的重载、操作符重载(operator关键字)
C++ 中友元的用法: 1.在类中使用friend关键字声明 2.类的友元可以是其它类或者具体函数 3.友元不是类的一部分 4.友元不受类中访问级别的限制 5.友元可以直接访问具体类中的所有成员. 友 ...
- C++类中的重载
函数重载回顾 函数重载的本质为相互独立的不同函数 C++中通过函数名和函数参数确定函数调用 无法直接通过函数名得到重载函数的入口地址 函数重载必然发生在同一个作用域 类中的成员函数可以进行重载 构造函 ...
- Kotlin 之操作符重载
Kotlin 之操作符重载 参考: kotlin in action kotlin 官方参考文档 运算符重载 Kotlin允许我们为自己的类型提供预定义的一组操作符实现(这些操作符都对应的成员函数 ...
- Kotlin——最详细的操作符与操作符重载详解(上)
本篇文章为大家详细的介绍Koltin特有的操作符重载.或许对于有编程经验的朋友来说,操作符这个词绝对不陌生,就算没有任何编辑基础的朋友,数学中的算数运算符也绝不陌生.例如(+.-.*./.>.& ...
- kotlin之操作符重载
一元操作符 表达式 对应的函数 +a a.unaryPlus() -a a.unaryMinus() !a a.not() a++ a.inc() a-- a.dec() fun main(arg: ...
- [置顶] operator overloading(操作符重载,运算符重载)运算符重载,浅拷贝(logical copy) ,vs, 深拷贝(physical copy)
operator overloading(操作符重载,运算符重载) 所谓重载就是重新赋予新的意义,之前我们已经学过函数重载,函数重载的要求是函数名相同,函数的参数列表不同(个数或者参数类型).操作符重 ...
- Python中的操作符重载
运算符重载是指在方法中拦截内置的操作----当类的实例出现在内置操作中,Python会自动调用自定义的办法,并且返回自定义方法的操作结果. 类可以重载python的操作符 操作符重载使我们的对 ...
随机推荐
- 学大伟业 Day 2 培训总结
一.dp 动态规划的本质 是一种思想.通过对原问题划分成子问题,寻找子问题之间的联系,通过求解子问题得出原问题的解.与贪心不同的是,动归是深谋远虑,考虑全局最优解:而贪心则目光短浅,只考虑局部最优解. ...
- SQLite动态库下载
其中带有“bundle”字样的表示动态库是按混合模式编译的,在 使用的时候只需要System.Data.SQLite.dll就可以了 而不带“bundle”的则是将非托管部分和托管部分分别编 译,Sy ...
- android(eclipse)新手常见问题总结(一)
1:jdk无法更新 进入工具里面手动获取镜像资源 并且改为强制 2:报错:This version of the rendering library is more recent than you ...
- oracle权限配置
系统权限管理:1.系统权限分类:DBA: 拥有全部特权,是系统最高权限,只有DBA才可以创建数据库结构. RESOURCE:拥有Resource权限的用户只可以创建实体,不可以创建数据库结构. CON ...
- JAVA如何跨项目调用接口
public String load(String url, String query) throws Exception { URL restURL = new URL(url); /* * 此处的 ...
- mysql存储过程和函数(一)
存储过程和函数是事先经过编译并存储在数据库的一段sql语句集合,调用存储过程和函数可以简化应用程序开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对提高数据运行效率是有好处的. 存储过程和 ...
- Gitlab简单使用指南
原文链接 一.在gitlab的网站创建一个project 定一个项目名,选定相关的项目设置,private,public等 项目创建成功后,得到项目git@XXX.git的地址,可用于将project ...
- 数字三角形W
题目描述 Description 数字三角形 要求走到最后mod 100最大 输入描述 Input Description 第1行n,表示n行 第2到n+1行为每个的权值 输出描述 Output De ...
- C++最接近整数的浮点运算
Function return ceil 不小于给定值的最接近整数值 floor 不大于给定值的最接近整数 trunc (C++11) 绝对值不大于给定值的最接近整数 round(C++11) 最接近 ...
- js判断两个日期是否在几个月之内
//比较两个时间 time1,time2均为日期类型 //判断两个时间段是否相差 m 个月 function completeDate(time1 , time2 , m) { var diffyea ...