Kotlin - 运算符与中缀表达式

简介: Kotlin - 运算符与中缀表达式

本系列学习教程笔记属于详细讲解Kotlin语法的教程,需要快速学习Kotlin语法的小伙伴可以查看“简洁” 系列的教程

快速入门请阅读如下简洁教程:
Kotlin学习教程(一)
Kotlin学习教程(二)
Kotlin学习教程(三)
Kotlin学习教程(四)
Kotlin学习教程(五)
Kotlin学习教程(六)
Kotlin学习教程(七)
Kotlin学习教程(八)
Kotlin学习教程(九)
Kotlin学习教程(十)

imgKotlin - 运算符与中缀表达式

基本运算符

常见的基本运算符有 +-*/%^? ,在 Kotlin 中,这些运算符都会有对应的具名函数:

表达式 翻译为
a + b a.plus(b)
a - b a.minus(b)
a * b a.times(b)
a / b a.div(b)
a % b a.rem(b)、 a.mod(b) (已弃用)
a..b a.rangeTo(b)
除此之处,还有一些常用的操作符(统称运算符),例如 in、[]、() 等:

表达式 翻译为
a in b b.contains(a)
a !in b !b.contains(a)
a[i] a.get(i)
a() a.invoke()
了解更多操作符对应的具名函数,请点击:https://www.kotlincn.net/docs/reference/operator-overloading.html(opens new window)

操作符重载

根据 Kotlin 官网给出的操作符和与之对应的具名函数,我们可以自定义一个计算复数的类 Complex :

class Complex(var real: Double, var imaginary: Double) {
// 复数相加:实部与虚部分别相加
operator fun plus(other: Complex): Complex {
return Complex(real + other.real, imaginary + other.imaginary)
}

// 复数与整数相加,只处理实部
operator fun plus(other: Int): Complex {
    return Complex(real + other, imaginary)
}

// 复数使用()时,求弦长(三角形的斜边长度)
operator fun invoke(): Double {
    return Math.hypot(real, imaginary)
}

override fun toString(): String {
    return "$real + ${imaginary}i"
}

}

fun main() {
val c1 = Complex(3.0, 4.0) // 3 + 4i
val c2 = Complex(2.0, 7.5) // 2 + 7.5i
println(c1 + c2) // 5.0 + 11.5i
println(c1 + 2) // 5.0 + 4.0i
println(c1()) // 5.0
}
一个类的同名运算符重载是可以有多个的,但参数类型或返回值类型要有所区别。

何类都可以定义或重载父类的基本运算符
运算符重载是通过重载与运算符对应的具名函数来定义
运算符重载对参数个数作要求,对参数和返回值类型不作要求
不能像 Scala 那样定义任意运算符,如:$在 Kotlin 中就没有与之对应的具名函数。

中缀表达式

上面已经说到了,Kotlin 不能像 Scala 那样定义任意运算符,那有没有办法定义一种具名函数,使其代码的书写跟运算符一样的呢?答案是:使用中缀表达式。

class Book {
infix fun on(any: Any?): Boolean {
return false
}
}

class Desktop

fun main() {
val book = Book()
val desktop = Desktop()
// println(book.on(desktop)) // 中缀表达式 本质还是函数
println(book on desktop)
}
中缀表达式是 只有一个参数,且用 infix 修饰 的函数
中缀表达式的作用是让函数调用时,可以省略 . 和 ()
中缀表达式一般只用于 dsl,滥用反而会让代码变得不够清晰。

相关文章
|
SQL 人工智能 运维
一文带你玩转 CODE CHINA 的开源广场|Code China
「Code China Explore」即 CODE CHINA 开源广场,主要用于聚合平台的优质内容,包括了开源课程、项目、话题及开源组织等,可以让所有开源爱好者进行知识分享和学习。下面着重介绍 Code China Explore 上面的组织及其享受的权益、话题及项目。
1191 0
|
11月前
|
设计模式 JavaScript 前端开发
addEventlistener和正常的onclick=()=> 的区别
【10月更文挑战第29天】`addEventListener` 是一种更推荐的添加事件处理函数的方式,它提供了更好的灵活性、可维护性和代码结构,能够满足复杂的事件处理需求,而 `onclick` 属性则更适合简单的、一次性的事件绑定场景,且在现代的JavaScript开发中,应尽量避免在HTML中直接使用 `onclick` 属性,以提高代码的质量和可维护性。
Latex更改字体颜色以及快速生成 SCI 论文的 revised version 和 pure version
Latex更改字体颜色以及快速生成 SCI 论文的 revised version 和 pure version
Latex更改字体颜色以及快速生成 SCI 论文的 revised version 和 pure version
|
11月前
|
容器
如何同时在捕获阶段和冒泡阶段添加事件监听器?
【10月更文挑战第29天】通过以上两种方法,可以根据具体的需求和场景,灵活地同时在捕获阶段和冒泡阶段添加事件监听器,以实现更复杂的事件处理和交互逻辑。
|
11月前
|
JavaScript 前端开发
除了点击事件,`addEventListener` 还能用于处理哪些事件类型?
【10月更文挑战第29天】 `addEventListener` 能够处理的事件类型非常丰富,涵盖了各种用户交互和页面状态变化的场景,通过合理地使用这些事件类型,可以为网页或应用程序添加丰富多样的交互效果和功能。
|
7月前
|
安全 物联网 数据建模
SSL证书:网络安全的重要基石
在数字化时代,数据安全与隐私保护至关重要。SSL证书作为一种关键网络安全技术,通过加密和认证确保通信安全。本文从定义、工作原理、类型、应用场景到选择与维护全面解析SSL证书。其类型包括DV、OV和EV,广泛应用于电商、金融、政府及物联网等领域。选择时需明确需求、信赖CA,并关注成本与服务。及时更新证书,保障持续安全。SSL证书是守护网络安全的重要工具,对提升信任度和满足合规性意义重大。
|
11月前
|
JavaScript 前端开发 Java
块级作用域和函数作用域在执行效率上有什么不同?
【10月更文挑战第29天】块级作用域和函数作用域在执行效率上各有特点。块级作用域在变量查找速度、内存管理和闭包处理等方面具有一定的优势,尤其是在处理复杂的作用域嵌套和循环中的变量引用时,能够提供更高效和更准确的执行结果。然而,在实际应用中,由于现代JavaScript引擎的优化以及大多数场景下性能差异并不十分显著,因此不能简单地说哪种作用域的执行效率绝对更高,而是需要根据具体的代码逻辑、应用场景和性能需求来综合考虑和选择使用哪种作用域。
|
11月前
|
设计模式 JavaScript 前端开发
js中new和object.creat区别
【10月更文挑战第29天】`new` 关键字和 `Object.create()` 方法在创建对象的方式、原型链继承、属性初始化以及适用场景等方面都存在差异。在实际开发中,需要根据具体的需求和设计模式来选择合适的方法来创建对象。
|
11月前
|
Kotlin
Kotlin - 参数与异常
Kotlin - 参数与异常
79 5
|
12月前
|
域名解析 缓存 网络协议
【网络】DNS,域名解析系统
【网络】DNS,域名解析系统
226 1