Kotlin 使用 infix 函数构建更可读的语法

to 不是 Kotlin 语言中的一个关键字,Kotlin 提供了 infix 函数这种高级语法糖特性,使我们可以使用 A to B 这样的语法结构。infix 函数只是把编程语言函数调用的语法规则调整了一下,比如 A to B 实际上等价于 A.to (B)。

infix fun String.beginsWith(prefix: String) = startsWith(prefix)

加上 infix 关键字后 beginsWith () 函数变成了一个 infix 函数,除了传统的函数调用方式之外,还可以用一种特殊的语法糖格式调用:

if ("Hello Kotlin" beginsWith "Hello") {
// 处理具体的逻辑
}

infix 函数由于其语法糖格式的特殊性,有两个比较严格的限制:首先,infix 函数不能定义成顶层函数,它必须是某个类的成员函数,可以使用扩展函数的方式将它定义到某个类种;其次,infix 函数必须接收且只能接收一个参数,至于参数类型是没有限制的。

public infix fun <A, B> A.to(that: B): Pair<A, B> = Pair(this, that)

to () 函数的源码中,使用定义泛型函数的方式将 to () 函数定义到了 A 类型下,并且接收一个 B 类型参数。to () 函数创建并返回一个 Pair 对象,A to B 这样的语法结构实际上得到的是一个包含 A、B 数据的 Pair 对象,mapOf () 函数实际上接收的正式一个 Pair 类型的可变参数列表,所以 mapOf () 函数中允许使用 A to B 这样的语法来构建键值对。

参考