Kotlin操作符重载:把标准操作加入到任何类中(KAD 17)

作者:Antonio Leiva

时间: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操作使用更复杂地转换做正确性检查,并且期望函数准确说明而不仅仅是为它的一个特殊名称,而稍有一点不同略有不同。

1 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操作符访问方括号中位置。这种实现非常容易:

1 class Employee(val id: Long, val name: String)
2
3 class Company(private val employees: List) {
4     operator fun get(pos: Int) = employees[pos]
5 }

这样你就可以使用它:

1 val company = Company(listOf(Employee(1235, "John"), Employee(2584, "Mike")))
2 val mike = company[1]

而你也是能够超于它,并用ID来恢复值,实现这样的功能:

1 operator fun get(id: Long) = employees.first { it.id == id }
2
3 val mike = company[2584]

结论

操作符能够帮助我们为使用通用符号表达已知操作提升可读性。

小心不要在会导致读者混淆的情况下使用它们,它们能够成为一个非常有趣的工具

如果您还不知道怎样做,我建议你获取免费指南,学习怎样创建您的第一个项目,或是直接获取这本书,学习怎样从零开始创建一个完整的应用程序。

a.unaryMinus()

时间: 2024-12-26 13:37:14

Kotlin操作符重载:把标准操作加入到任何类中(KAD 17)的相关文章

MFC--串口编程---WIN API的方式将串扣操作封装在线程类中

串口采集数据 本文档介绍的是如何获取串口原始数据并将原始数据解析成可处理或可展示的数据. 一.串口采集有很多方式: 1).MFC有一个专门的控件,直接编程采集,一个控件只能采集一个串口,而且串口名字比如是COM20可能就打不开(这里我没有实践,师兄给这样说的),波特率太高读数会出错. 2).利用Windows API通信函数(该工程里面就采用的这种方式) 3).利用Visual C++的标准通信函数_inp._inpw._inpd._outp等直接对串口进行操作. 4).第三方编写的通信类. 二

操作符重载!

操作符重载为操作符提供不同的语义 #include <iostream> using namespace std; struct Complex { int a; int b; }; int main() { Complex c1 = {1,2}; Complex c2 = {3,4}; Complex c3 = c1 + c2;//编译出错 cout << "Press any key to continue..." << endl; cin.ge

【C/C++】操作符重载

常见问题 Q1. 下列运算符,在C++语言中不能重载的是( ). A. * B. ?: C. :: D. delete Q2. 编写类String的构造函数.析构函数和赋值函数. Q3. 复制构造函数与赋值运算符的区别是什么? Q4. 下述代码的输出结果是什么? 1 #include <iostream> 2 using namespace std; 3 class X 4 { 5 public: 6 X() { cout << "constructor" &l

操作符重载的概念

复数计算第一种形式(自定义复数类): 1 #include <stdio.h> 2 3 class Complex 4 { 5 int a; 6 int b; 7 public: 8 Complex(int a = 0, int b = 0) 9 { 10 this->a = a; 11 this->b = b; 12 } 13 14 int getA() 15 { 16 return a; 17 } 18 19 int getB() 20 { 21 return b; 22 }

C++--操作符重载 复数类

一.操作符重载 Q:下面的复数解决方案是否可行? class Complex { public: int a; int b; }; int main() { Complex c1={1,2}; Complex c2={3,4}; Complex c3=c1+c2; return 0; } 该段代码想要实现的是将两个复数类进行相加得出第三个类代码实现的运行结果由上面的结果图可以得知,出现的错误是无法匹配+号操作符的操作,同时出现 的潜在问题是a与b是public成员,在实际的操作中应将a与b设置为

C++ Primer 学习笔记_26_操作符重载与转换(1)--可重载/不可重载的操作符、成员函数方式重载、友元函数方式重载

C++ Primer 学习笔记_26_操作符重载与转换(1)--可重载/不可重载的操作符.成员函数方式重载.友元函数方式重载 引言: 明智地使用操作符重载可以使类类型的使用像内置类型一样直观! 一.重载的操作符名 像任何其他函数一样,操作符重载函数有一个返回值和一个形参表.形参表必须具有操作符数目相同的形参.比如赋值时二元运算,所以该操作符函数有两个参数:第一个形参对应着左操作数,第二个形参对应右操作数. 大多数操作符可以定义为成员函数或非成员函数.当操作符为成员函数时,它的第一个操作数隐式绑定

Asp.Net SignalR Hub类中的操作详解

Asp.Net SignalR Hub类中的操作详解 Hub类中的操作 在服务端我们要通过Hub类做一系列操作,下面就说说我们都可以做什么操作 客户端的发送消息操作 调用所有的客户端的helloClient方法 Clients.All.helloClient(); 调用除了给定ConnectionId的客户端之外的所有客户端的helloClient方法 Clients.AllExcept(Context.ConnectionId).helloClient(); 调用指定的connectionId

ASP.NET OOP-关联操作符重载的操作_RelationalOperatorOverloading_A

一.首先要在"App_Code / .cs"描述"类"所要的相关程序. /// /// C# ?面向对象程序设计"关联操作符重载 (RelationalOperatorOverloading) "的用法 A. ///? /// 关联的逻辑操作符可以经由自订的类型与运算之后,返回一个 true 或 false 的 /// 运算结果. ///? /// 此范例将介绍"> <"这种关联操作符重载的操作. ///? ///

Python中的操作符重载

类可以重载python的操作符 操作符重载使我们的对象与内置的一样.__X__的名字的方法是特殊的挂钩(hook),python通过这 种特殊的命名来拦截操作符,以实现重载. python在计算操作符时会自动调用这样的方法,例如: 如果对象继承了__add__方法,当它出现在+表达式中时会调用这个方法.通过重载,用户定义的对 象就像内置的一样. 在类中重载操作符 1.操作符重载使得类能拦截标准的python操作. 2.类可以重载所有的python的表达式操作符. 3.类可以重载对象操作:prin