Kotlin 学习笔记(一)infix函数

什么是 infix 函数

Kotlin允许在不使用括号和点号的情况下调用函数,那么这种函数被称为 infix函数。

举个例子,直观地感受一下:

map(
  1 to "one",
  2 to "two",
  3 to "three"
)

这里的 to 就是一个infix函数。看起来像是一个关键字,实际是一个to()方法。
下面是to的源码。可以看到这个方法前面除了使用了publich修饰外,还多了一个infix

/**
 * Creates a tuple of type [Pair] from this and [that].
 *
 * This can be useful for creating [Map] literals with less noise, for example:
 * @sample samples.collections.Maps.Instantiation.mapFromPairs
 */
public infix fun  A.to(that: B): Pair = Pair(this, that)

中缀表示法

中缀表示法(或中缀记法)是一个通用的算术或逻辑公式表示方法, 操作符是以中缀形式处于操作数的中间(例:3 + 4)。
标有infix函数,可以使用中缀表示法调用。

如何写一个 infix 函数

必须满足以下要求:

  • 它们必须是成员函数或扩展函数;
  • 它们必须只有一个参数;
  • 其参数不得接受可变数量的参数且不能有默认值。
class Util(val number:Int) {
    infix fun sum(other: Int) {
      println(number + other)
   }
}
val u = Util(5)
 
u sum 5 //  10
u sum 7 // 12

请注意,中缀函数总是要求指定接收者与参数。当使用中缀表示法在当前接收者上调用方法时,需要显式使用 this;不能像常规方法调用那样省略。

class MyStringCollection {
    infix fun add(s: String) { /* …… */ }
    
    fun build() {
        this add "abc"   // 正确
        add("abc")       // 正确
        add "abc"        // 错误:必须指定接收者
    }
}

中缀函数与操作符的优先级

  1. 中缀函数调用的优先级低于算术操作符、类型转换以及 rangeTo 操作符
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<*>)
  1. 中缀函数调用的优先级高于布尔操作符 && 与 ||、is- 与 in- 检测以及其他一些操作符。
a && b xor c  等价于   a && (b xor c)
a xor b in c  等价于  (a xor b) in c

相关资料

  • 中缀表示法
  • Infix Functions in Kotlin

你可能感兴趣的:(Kotlin 学习笔记(一)infix函数)