细谈kotlin中缀表达式

  • Kotlin 是一种适应你编程风格的语言,允许你在想什么时候写代码就什么时候写代码。Kotlin 提供了一些机制,帮助我们编写易读易懂的代码。
  • 其中一个非常有趣的机制是 中缀表达式(infix notation) 。它允许我们定义和调用函数时省略点号(.)和括号。

中缀表达式

中缀表达式在算术和逻辑代码中使用。它的特点是操作符写在两个操作数之间,例如:2 + 3,其中 "+" 是一个中缀操作符。

在中缀表达式中,函数名放在参数之间,函数名本身充当操作符。例如函数 add(2, 4) 表示加法(add),也就是 2 add 4

要定义中缀函数,必须满足以下条件:

  • 必须是成员函数或扩展函数。

  • 必须有且只有一个参数。

  • 参数不能是可变数量参数(vararg),且不能有默认值。

只需在函数定义前加上 infix 关键字即可定义中缀函数。

kotlin 复制代码
infix fun Int.add(x: Int): Int = this + x

fun main() {
    println(1.add(2)) // 结果是 3,作为扩展函数调用
    println(1 add 2)  // 结果是 3,作为中缀函数调用
}

解释代码

你可以随时创建中缀函数,比如为了提高代码的可读性,或者创建领域特定语言(DSL)。但要记住,中缀函数调用的优先级低于算术操作符以及语言内置的其他元素,比如类型转换和 rangeTo 操作符。

kotlin 复制代码
infix fun Int.add(x: Int): Int = this + x
fun main() {
    println(1 add 2 + 3)   // 6,等价于 1 add (2 + 3)
    println(1 add (2 + 3)) // 6
    println(0..(1 add 3))  // 0..4
}

另一方面,中缀函数调用的优先级高于布尔操作符 &&||,以及类型检查 is 和区间检查 in 等操作符。

kotlin 复制代码
infix fun Int.add(x: Int): Int = this + x
fun main() {
    println(1 and 2 xor 3 add 4) // 等价于 1 and 2 xor (3 add 4) -> 7
    println(1 add 2 in 3..4)     // 等价于 (1 add 2) in 3..4 -> true
}

记住,中缀函数调用时,接收者和参数都必须明确指定,并且在函数体内必须使用 this 来引用当前接收者。

kotlin 复制代码
infix fun Int.add(x: Int): Int = this + x // this 是接收者
fun main() {
    println(2 + 3) // 这里的接收者是 2
}

标准库中的中缀函数

Kotlin 标准库中有许多使用中缀调用的函数示例:

  • to():用于创建 Pair<A, B>Map 的条目。

  • 位运算函数:and(), or(), shl(), shr(), ushr(), xor()

  • 布尔类型的方法:and(), or(), xor()

  • 字符串类的方法:matches()zip() 等。

kotlin 复制代码
fun main() {
    println("Hi" to "Kotlin")                          // 输出: (Hi, Kotlin)
    println(0x123456 shr 16)                           // 输出: 18
    println(true and false or true xor false)          // 输出: true
    println("Hi, Kotlin" matches ".*Kotlin".toRegex()) // 输出: true
}

结论

中缀函数是让代码更具可读性和可维护性的强大工具。在使用时要注意其定义要求和运算符优先级。中缀表达式能帮助你提升代码质量,扩展代码书写的可能性。

相关推荐
行者964 分钟前
Flutter跨平台开发在OpenHarmony上的评分组件实现与优化
开发语言·flutter·harmonyos·鸿蒙
阿蒙Amon14 分钟前
C#每日面试题-Array和ArrayList的区别
java·开发语言·c#
SmartRadio31 分钟前
ESP32添加修改蓝牙名称和获取蓝牙连接状态的AT命令-完整UART BLE服务功能后的完整`main.c`代码
c语言·开发语言·c++·esp32·ble
且去填词1 小时前
Go 语言的“反叛”——为什么少即是多?
开发语言·后端·面试·go
知乎的哥廷根数学学派1 小时前
基于生成对抗U-Net混合架构的隧道衬砌缺陷地质雷达数据智能反演与成像方法(以模拟信号为例,Pytorch)
开发语言·人工智能·pytorch·python·深度学习·机器学习
yeziyfx2 小时前
kotlin中 ?:的用法
android·开发语言·kotlin
charlie1145141912 小时前
嵌入式的现代C++教程——constexpr与设计技巧
开发语言·c++·笔记·单片机·学习·算法·嵌入式
古城小栈2 小时前
Rust 网络请求库:reqwest
开发语言·网络·rust
hqwest2 小时前
码上通QT实战12--监控页面04-绘制6个灯珠及开关
开发语言·qt·qpainter·qt事件·stackedwidget
i橡皮擦3 小时前
TheIsle恐龙岛读取游戏基址做插件(C#语言)
开发语言·游戏·c#·恐龙岛·theisle