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的操作符 操作符重载使我们的对 ...
随机推荐
- 2017.9.12 初入HTML -----学习总结(二)
接上:..... (4)标记可分为: 4.1单标记:(单标记仅单独使用就可以表达完整的意思) 基本语法:<标记名称/> 例如:<br/>实现换行的功能.<hr/>实 ...
- focal loss和retinanet
这个是自己用的focal loss的代码和公式推导:https://github.com/zimenglan-sysu-512/Focal-Loss 这个是有retinanet:https://git ...
- Django学习之ORM操作
一.一般操作 二.必知必会13条 返回QuerySet对象的方法有 特殊的QuerySet 返回具体对象的 返回布尔值的方法有 返回数字的方法 三.单表查询之神奇的双下划线 四.ForeignKey操 ...
- 学校管理系统设计java(数据库、源码、演讲内容、ppt等)
该系统使用java语言编写 获取班级项目展第二名 项目展示:https://www.bilibili.com/video/av27910081/?p=10 登录截图 git:https://githu ...
- Android学习笔记_79_ Android 使用 搜索框
1.在资源文件夹下创建xml文件夹,并创建一个searchable.xml: android:searchSuggestAuthorityshux属性的值跟实现SearchRecentSuggesti ...
- how to create a custom form for sharepoint list
在VS中创建一个applicationPage映射到Layouts文件夹下,然后代码如下: SPList lstTest = web.Lists["Shared Documents" ...
- LeetCode 中级 - 第k个排列(60)
可以用数学的方法来解, 因为数字都是从1开始的连续自然数, 排列出现的次序可以推 算出来, 对于n=4, k=15 找到k=15排列的过程: 1 + 对2,3,4的全排列 (3!个) 2 + 对1,3 ...
- poj_2084_Game of Connections
This is a small but ancient game. You are supposed to write down the numbers 1, 2, 3, . . . , 2n - 1 ...
- SAP物料主数据的屏幕字段控制,必输,隐藏
http://www.cnblogs.com/275147378abc/p/5699077.html 1.事务码MM01,把物料组设为选填字段. 2.找到物料组的屏幕字段. 3.在后台根据屏幕字段找到 ...
- 通过xshell在linux上安装JDK8
通过xshell在linux上安装JDK8 0)新建连接,输入名称与主机IP地址 1)输入用户名与密码,创建连接 2)执行命令cd /usr/进入文件夹:再输入mkdir java创建java文件夹 ...