Better

业精于勤荒于嬉

Idiomatic Kotlin:infix

Better's Avatar 2019-05-26 Kotlin

  1. 1. define and use
  2. 2. bummock
  3. 3. precedence
  4. 4. this
  5. 5. 参考

infix关键字标记的函数,可以使用中缀表达式的方式调用。使得在调用方法的时候,不需要dot.也不需要parentheses ()

比如在构造Pair<A,B>对象的时候经常使用to函数来实现

1
2
3
4
# 使用中缀
1 to "one"
# 不使用中缀
1.to("one")

这样提高了代码易读性

申明inflx方法,只需在普通的方法前面加infix关键字就行,但是需满足以下限制:

  1. 必须是成员函数或者是扩展函数
  2. 方法的参数只能有一个,不能使用vararg
  3. 参数不能有默认值

define and use

define:

1
2
3
4
5
class StringNames {
infix fun appendOther(other: String): String {
return "hello $other"
}
}

use:

1
2
val stringNames = StringNames()
val helloworld = stringNames appendOther "world"

bummock

查看编译后的代码:

1
2
3
4
5
6
7
public final class StringNames {
@NotNull
public final String appendOther(@NotNull String other) {
Intrinsics.checkParameterIsNotNull(other, "other");
return "hello " + other;
}
}
1
2
3
4
5
6
public final class TestStringNameKt {
public static final void main() {
StringNames stringNames = new StringNames();
String helloworld = stringNames.appendOther("world");
}
}

infix标记的函数被编译成final方法。而调用的时候没有特别的变化,跟普通的函数调用一样。在编译期间给转换成正常的 Java 代码了

precedence

infix的调用跟运算符的调用很像。但是在优先级上是有一些先后区别的。

  1. 低。infix比起算术运算符(+,-,*,/),type cast,rangeTo
    • 1 add 2 + 3等价于1 add (2 + 3)
    • 10 until n * 2等价于0 until (n * 2)
    • 1xs union ys as Set<*>等价于xs union (ys as Set<*>)
  2. 高。infix比起 boolean 操作符要高 &&||isin
    • a && b xor c等价于a && (b xor c)
    • a xor b in c等价于(a xor b) in c

详细数据

Precedence Title Symbols
Highest Postfix ++, --, ., ?., ?
  Prefix -, +, ++, --, !, label
  Type RHS :, as, as?
  Multiplicative *, /, %
  Additive +, -
  Range ..
  Infix function simpleIdentifier
  Elvis ?:
  Named checks in, !in, is, !is
  Comparison <, >, <=, >=
  Equality ==, !==
  Conjunction &&
  Disjunction ||
Lowest Assignment =, +=, -=, *=, /=, %=

this

infix函数需要指定调用者以及参数。如果在调用者内部调用infix方法需要显示的使用this

1
2
3
4
5
6
7
8
9
10
11
12
class StringCollection {

infix fun add(s: String) {
// perform some action here
}

fun build() {
this add "abc" // Works fine, calls the infix function
add("abc") // Works fine, note this is not an infix call
add "abc" // error: the receiver must be specified
}
}

参考

kotlinDoc-infix
Idiomatic Kotlin: Infix functions

This article was last updated on days ago, and the information described in the article may have changed.