什么是 infix
函数?
infix
关键字可以让 单参数的函数 以 更自然的语法 书写,使代码更易读。
你可以把它理解为 一种特殊的调用方式,不需要 .
和 ()
,让代码像 自然语言 一样流畅。
要使用 infix
,需要满足 三个条件:
- 必须是成员函数或扩展函数(它必须属于某个类或某种类型)。
- 必须只有且只能有一个参数(如果有多个参数,就不能用
infix
)。 - ⭐⭐⭐⭐⭐⭐调用时可以省略
.
和()
(但仍然可以用.
调用)。
简单示例 1:数字比较
不使用 infix
plaintext
1 2 3 4 5 6 7 | fun isBigger(a: Int, b: Int): Boolean { return a > b } fun main() { println(isBigger(10, 5)) // 输出:true } |
这个函数 isBigger(10, 5)
可读性一般,我们可以用 infix
改写它。
使用 infix
plaintext
1 2 3 4 5 6 7 | infix fun Int.isBiggerThan(other: Int): Boolean { return this > other } fun main() { println(10 isBiggerThan 5) // 输出:true } |
✅ 10 isBiggerThan 5
读起来就像 自然语言,比 isBigger(10, 5)
更易懂。
简单示例 2:创建 “名字-值” 对
普通方式
plaintext
1 2 3 4 5 6 7 8 | fun pair(key: String, value: String): Pair<String, String> { return Pair(key, value) } fun main() { val result = pair("name", "Alice") println(result) // 输出: (name, Alice) } |
使用 infix
plaintext
1 2 3 4 5 6 7 8 | infix fun String.with(value: String): Pair<String, String> { return Pair(this, value) } fun main() { val result = "name" with "Alice" println(result) // 输出: (name, Alice) } |
✅ "name" with "Alice"
读起来更像 自然语言,比 pair("name", "Alice")
更直观。
简单示例 3:自定义数学运算
普通加法
plaintext
1 2 3 4 5 6 7 8 9 10 11 12 13 | class Point(val x: Int, val y: Int) { fun add(other: Point): Point { return Point(this.x + other.x, this.y + other.y) } } fun main() { val p1 = Point(2, 3) val p2 = Point(4, 5) val result = p1.add(p2) println("(${result.x}, ${result.y})") // 输出:(6, 8) } |
使用 infix
plaintext
1 2 3 4 5 6 7 8 9 10 11 12 13 | class Point(val x: Int, val y: Int) { infix fun add(other: Point): Point { return Point(this.x + other.x, this.y + other.y) } } fun main() { val p1 = Point(2, 3) val p2 = Point(4, 5) val result = p1 add p2 // 👈 重点:不需要 `.` 和 `()` 了! println("(${result.x}, ${result.y})") // 输出:(6, 8) } |
✅ p1 add p2
比 p1.add(p2)
更像数学公式,可读性更强。
错误示范
plaintext
1 2 3 4 5 6 7 8 9 10 11 12 13 | class Point(val x: Int, val y: Int) { infix fun Point.add(other: Point): Point { //和正确例子唯一差别就是这一行 return Point(this.x + other.x, this.y + other.y) } } fun main() { val p1 = Point(2, 3) val p2 = Point(4, 5) val result = p1 add p2 // 👈 重点:不需要 . 和 () 了! println("(${result.x}, ${result.y})") // 输出:(6, 8) } |
不能编译,是因为 infix 函数不能在类内部对自身类型(Point
)扩展。
总结
infix
让代码更像自然语言,增强可读性。- 只能用于:
- 类的成员函数(如
Point
里的add
)。 - 扩展函数(如
String.with()
)。 - 且只接受一个参数。
- 类的成员函数(如
- 调用时可以省略
.
和()
,让代码更流畅。