Kotlin-中缀函数

在 Kotlin 里,中缀函数属于一种特殊的函数,它能以中缀表示法来调用,也就是把函数名置于两个操作数之间。

特性:

  1. 仅适用于成员函数或扩展函数:中缀函数既可以是类的成员函数,也可以是对某个类的扩展函数。
  2. 仅有一个参数:中缀函数只能有一个参数,并且不能有默认值。
  3. 使用 infix 关键字:要把一个函数定义成中缀函数,必须使用 infix 关键字。

语法:

// 成员函数
class MyClass {
    infix fun functionName(param: Type): ReturnType {
        // 函数体
    }
}

// 扩展函数
infix fun Type.functionName(param: Type): ReturnType {
    // 函数体
}

使用示例:

class Person(val name: String) {
    // 定义一个中缀函数
    infix fun knows(other: Person): Boolean {
        return name == other.name
    }
}

fun main() {
    val person1 = Person("Alice")
    val person2 = Person("Bob")
    val person3 = Person("Alice")

    // 使用中缀表示法调用函数
    val result1 = person1 knows person2
    val result2 = person1 knows person3

    println(result1) // 输出: false
    println(result2) // 输出: true
}

在这个例子中,knows 是 Person 类的中缀函数,用于判断两个 Person 对象是否代表同一个人。在 main 函数里,我们使用中缀表示法调用 knows 函数,就像使用运算符一样。

运算符优先级:

  • 结果上相等(== 等价于 equals())
  • 引用上相等(=== 判断两个变量是否都是引用同一个对象)
优先级运算符
最高后置:++ . ?
前置:+ ++ !
类型转换:as
乘除余:* / %
加减:+ -
范围运算符:..
Infix function 中缀函数
Elvis 运算符:?:
in !in is !is
< > <= >=
== != === !==
逻辑与:&&
逻辑或: ||
最低赋值: = += -= *= /= %=
  • 1 shl 2 + 3 相当于 1 shl (2+3)
  • 0 until n*2 相当于 0 until (n*2)
  • xs union ys as Set<*> 相当于 xs union (ys as Set<*>)
  • a && b xor c相当于a && (b xor c)
  • a xor b in c相当于(a xor b) in c

如果需要在类中使用中缀函数,必须明确函数的调用方(接收器), 如:

class Person(val name: String) {
    // 定义一个中缀函数
    infix fun knows(other: Person): Boolean {
        return name == other.name
    }
    
    fun compare(other: Person) {
        knows(other)
        this.knows(other)
        this knows other
//      knows other 错误:没有指定调用方法或无法隐式表达
    }
}

适用场景

  • 提升代码可读性:当函数代表的是两个对象之间的某种关系时,使用中缀函数能让代码更自然、易读。
  • 模拟自定义运算符:借助中缀函数,可以模拟自定义运算符,让代码更具表现力。
### Kotlin 函数概述 Kotlin 的函数使用 `fun` 关键字来声明[^2]。函数定义的一般形式如下: ```kotlin visibleModifier fun functionName(parameterList): returnType { functionBody } ``` 其中,`visibleModifier` 是可选的可见性修饰符,默认为公共 (`public`)。 #### 函数定义与调用 当创建一个简单的函数时,语法结构相对简单。例如,下面是一个将输入整数翻倍的函数示例: ```kotlin fun double(x: Int): Int { return 2 * x } // 调用此函数的方式很简单 val result = double(4) // 结果应为8 ``` #### 参数处理 对于具有多个参数的情况,在定义过程中可以直接给定默认值,从而允许省略某些参数而不影响正常工作。此外,还可以通过命名方式传递这些参数以提高代码清晰度[^1]。 #### 返回值说明 每个函数都需明确指出其返回的数据类型;如果不需要任何输出,则应该标注为 `Unit` 类型(类似于 Java 中 void)。值得注意的是,单表达式的函数可以通过简化写法直接写出逻辑而无需显式地加上 `{}` 和 `return` 关键词。 #### 高级特性支持 除了基本功能外,Kotlin 还提供了多种高级特性的实现方法,如 Lambda 表达式、匿名函数以及内联函数等。特别是关于如何把其他函数当作参数或者返回值的形式进行了优化设计,使得编程更加灵活高效[^3]。 ```kotlin // 计算器例子展示了如何利用字符串决定具体的操作,并最终得到相应的二元运算结果。 fun calculate(operation: String): (Int, Int) -> Int { when (operation) { "+" -> return { a, b -> a + b } "-" -> return { a, b -> a - b } "*" -> return { a, b -> a * b } "/" -> return { a, b -> a / b } else -> throw IllegalArgumentException("Unsupported operation: $operation") } } ``` 上述代码片段演示了一个接受操作符名称作为输入并返回对应计算行为的例子。这里使用的闭包机制让开发者能够轻松构建动态变化的功能模块。 #### 扩展与其他特殊类型的函数 为了增强语言表现力,还引入了诸如扩展函数这样的概念,它允许向现有类添加新成员而无须修改源码文件。另外也有专门针对特定场景定制化的中缀记号风格和尾递归优化版本可供选用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值