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的操作符 操作符重载使我们的对 ...
随机推荐
- Ajax去除缓存
1.在Ajax发送请求钱加上anyAjaxObj.setRequestHeader("If-Modeified-Since","0").2.在Ajax发送请求钱 ...
- 火狐 SSL 收到了一个弱临时 Diffie-Hellman 密钥
火狐 SSL 收到了一个弱临时 Diffie-Hellman 密钥 最近在用FireFox 调试时使用Https,连接 https网址 时发生错误. 在服务器密钥交换握手信息中 SSL 收到了一个 ...
- TCP和UDP的现实应用
以下应用的区分是基于TCP可靠传输,UDP不可靠传输 TCP一般用于文件传输(FTP HTTP 对数据准确性要求高,速度可以相对慢),发送或接收邮件(POP IMAP SMTP 对数据准确性要求高,非 ...
- Hibernate学习第一天
Hibernate框架第一天 今天任务 1. 使用Hibernate框架完成对客户的增删改查的操作 教学导航 1. 能够说出Hibernate的执行流程 2. 能够独立使用Hibernate框架完成增 ...
- JDBCUtils工具类(转)
JdbcUtils.java import java.sql.Connection; import java.sql.SQLException; import javax.sql.DataSource ...
- ios微信公众号分享回调事件
IOS手机在分享成功后,回调事件无法正常执行,在回调方法里面加入: setTimeout(function () { //todo }, ); 例如: //分享 Share({ title: &quo ...
- (第04节)集成SpringMVC框架
在上一节的基础上集成spring_mvc 首先添加依赖文件 <properties> <javax.servlet.version>4.0.0</javax.servle ...
- 为什么我用了$().height()还是对不齐呢?
有一个这样的需求:有两个显示内容的框,要使他们高度一致,因为他们存放的内容多少和结构不一样,左边内容少,右边内容多.这就导致了右边会比左边高,解决方法就是超出部分用滚轮显示,那这时就先要调整右边的高度 ...
- 【shell脚本学习-4】
文本处理 #!/bin/bash#----------文本处理---------- #---------------echo----------------- # "-n":处理光 ...
- redis 带入的挖矿病毒 qW3xT.2 wnTKYg 解决方法
最近我的阿里云ecs 老是收到 云盾态势感知系统检测到异常 top -c 后发现一个 疑似病毒 /tmp/qW3xT.2 看到网友们的解决方案 试过之后效果不错,可以用的 知道wnTKYg是什么鬼之 ...