kotlin关键字infix

一. 概念

Kotlin中缀函数(Infix Functions)是一种特殊类型的函数,可以使用中缀符号(如+-*/等)来调用。这种语法使得代码更加简洁易读。中缀函数通常用于描述两个对象之间的关系,例如数学中的加法、减法等运算。

要定义一个中缀函数,需要将infix关键字放在函数声明前面,而且必须满足以下条件:

  1. 必须是成员函数或者扩展函数

  2. 只有1个参数

  3. 参数必须是无默认值的

错误示例

// 编译器提示:'infix' modifier is inapplicable on this function: should not have varargs or parameters with default values
// 翻译:“infix”修饰符不适用于此函数:不应具有可变参数或具有默认值的参数
infix fun String.plus(x: String = "123"): String {
    
    
    return this + x
}

// 'infix' modifier is inapplicable on this function: must have a single value parameter
// 翻译: “infix”修饰符不适用于此函数:必须有一个单值参数
infix fun String.plus(x: String,y: String): String {
    
    
    return this + x
}

正确示例:

infix fun Int.plus(x: Int): Int {
    
    
    return this + x
}

fun main() {
    
    
    val a = 10
    val b = 5
    val result = a plus b // 等价于 a.plus(b)
    println(result) // 输出 15
}

在上面的示例中,我们定义了一个中缀函数 plus,该函数接受一个整数参数 x,并将其与调用该函数的整数对象相加。在 main 函数中,我们可以使用中缀符号 plus 调用该函数,并将结果存储在 result 变量中。

源码示例

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

fun main() {
    
    
    // 调用
    val pair = "key" to "value"
}

上面的代码将创建一个 Pair 对象,其中第一个元素是字符串 "key",第二个元素是字符串 "value"

二. 注意

1. 中缀函数的优先级低于算术运算符和比较运算符,但高于逻辑运算符。因此,如果需要在表达式中混合使用中缀函数和运算符,应该使用括号来明确优先级。

例如:

infix fun String.plus(x: String): String {
    
    
    return this + x
}

fun main() {
    
    
    val a = "Hello"
    val b = "World"
    val result = (a plus b).length // 加括号强制优先级
    println(result) // 输出 10
}

在上面的示例中,我们定义了一个中缀函数 append,该函数将两个字符串连接起来。在 main 函数中,我们使用括号将中缀函数的调用和后续操作组合在一起,以明确优先级。

2.如果你非常需要使用保留字作为中缀函数的名称,可以使用反引号将保留字括起来

部分保留字如下:

as, as?, break, class, continue, do, else, false, for, fun, if, in, !in, interface, is, !is, null, object, package, return, super, this, throw, true, try, typealias, val, var, when, while

例如:

// is作为保留字需要使用``括起来,建议尽可能避免在中缀函数的名称中使用保留字
infix fun String.`is`(other: String): Boolean {
    
    
    return this == other
}

猜你喜欢

转载自blog.csdn.net/flytosky21/article/details/130021885