开发者

Kotlin 中 infix 关键字的原理和使用场景解析

开发者 https://www.devze.com 2025-05-20 10:21 出处:网络 作者: 橙子19911016
目录1 infix 的原理2 使用场景2.1 自然语言风格的 API2.2 数学或逻辑表达式2.3 键值对构造(如 to 函数)2.4 链式操作3 与普通函数相比4 注意事项5 标准库中的经典案例5.1 to 函数5.2 until 函数5.3 集合操作www.dev
目录
  • 1 infix 的原理
  • 2 使用场景
    • 2.1 自然语言风格的 API
    • 2.2 数学或逻辑表达式
    • 2.3 键值对构造(如 to 函数)
    • 2.4 链式操作
  • 3 与普通函数相比
    • 4 注意事项
      • 5 标准库中的经典案例
        • 5.1 to 函数
        • 5.2 until 函数
        • 5.3 集合操作www.devze.com

      在 Kotlin 中,使用 infix 关键字修饰的函数称为中缀函数,使用是可以省略 .(),允许以更自然(类似自然语言)的语法调用函数,这种特性可以使代码更具可读性。

      1 infix 的原理

      中缀函数必须满足以下条件:

      • 必须是成员函数(成员方法)或扩展函数;
      • 有且仅有一个参数,且不能有默认值;
      • 必须显式声明 infix 关键字;

      调用方法:

      • 普通函数:a.function(b);
      • 中缀函数:a function b (省略点号和括号,增强可读性);

      示例:

      class Person(private val name: String) {
          // 成员中缀函数
          infix fun say(message: String) {
              println("$name says $message")
          }
      }
      // 扩展中缀函数
      infix fun Int.multiply(factor: Int): Int = this * factor

      反编译成 Java 代码:

      public final class Person {
         private final String name;
         public final void say(@NotNull String message) {
            Intrinsics.checkNotNullParameter(message, "message");
            String var2 = this.name + " say " + message;
            System.out.println(var2);
         }
         public Person(@NotNull String name) {
            Intrinsics.checkNpythonotNullParameter(name, "name");
            superjs();
            this.name = name;
         }
      }

      底层实现:

      • 中缀函数本质上是普通函数,但通过 infix 关键字允许省略 . 和括号 ()
      • 编译器在语法层面给了支持;(Kotlin 的很多特性都是在语法和编译器上的优化)

      2 使用场景

      2.1 自然语言风格的 API

      适用于需要代码接近自然语言的场景,例如 DSL(领域特定语言)设计:

      infix fun <T> T.shouldEqual(expected: T) {
          if (this != expected) throw AssertionError("Excepted $expected, but got $this")
      }
      // 使用
      actualValue shouldEqual expectedValue

      2.2 数学或逻辑表达式

      简化数学运算符或逻辑操作的表达:

      infix fun Int.pow(exponent: Int): Int = toDouble().pow(exponent).toInt()
      val result = 2 pow 3 // 等价于 2.pow(3)

      2.3 键值对构造(如 to 函数)

      Kotlin 标准库中的 to 函数是典型的中缀函数:

      val map = mapOf(
          "name" to "Eileen",
          "age" tandroido 30
      )

      2.4 链式操作

      结合中缀函数和扩展函数实现链式调用:

      infix fun String.concatWith(another: String) = "$this$another"
      // 链式中缀调用
      val message = "Hello" concatWith "World" concatWith "!"

      3 与普通函数相比

      Kotlin 中 infix 关键字的原理和使用场景解析

      4 注意事项

      • 参数限制:中缀函数只能有一个参数,且不能有默认值;
      • 可见性:中缀函数必须是 publicinternal(默认,模编程块内可见);
      • 优先级:中缀函数的优先级是低于算数运算符,但高于布尔运算符;
      1 + 2 and 3 // 等价于 (1 + 2) and 3

      5 标准库中的经典案例

      Kotlin 标准库广泛使用中缀函数。

      5.1 to 函数

      用于创建 Pair 对象:

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

      5.2 until 函数

      生成区间:

      val range = 1 until 10 // 等价于 1.until(10)

      5.3 集合操作

      例如 stepdownTo

      for (i in 10 downTo 1 step 2) {
      }

      到此这篇关于Kotlin 中 infix 关键字的原理和使用场景的文章就介绍到这了,更多相关Kotlin infix 关键字内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!

      0

      精彩评论

      暂无评论...
      验证码 换一张
      取 消

      关注公众号