Kotlin中a.this@swap语法及swap函数实现的疑问
理解Kotlin中带接收者函数的swap扩展
先把你贴的代码格式化清晰:
fun <A, B, C> (A.(B) -> C).swap(): (B.(A) -> C) = { a: A -> a.this@swap(this) }
核心概念:带接收者的函数类型
A.(B)->C是Kotlin的带接收者函数类型,它表示一个可以在A的实例上调用的函数,接收一个B类型参数,返回C。比如String.(Int)->Boolean可以对应这样的函数:
fun String.checkLength(min: Int): Boolean = this.length >= min
拆解swap函数的逻辑
swap是A.(B)->C类型的扩展函数,作用是把原函数的接收者和参数位置互换,返回B.(A)->C类型的函数——新函数以B为接收者,以A为参数,最终返回C。
逐行解释lambda代码
lambda{ a: A -> a.this@swap(this) }就是最终返回的B.(A)->C函数,拆解每个部分:
- 最内层的
this:这个lambda属于B.(A)->C类型,所以它的接收者是B的实例,这里的this就指代这个B实例(也就是调用swap后得到的新函数的接收者)。 this@swap:@swap是标签限定符,用来明确this的作用域——这里的this@swap指的是swap函数的接收者,也就是原来的那个A.(B)->C类型的函数实例(下称「原函数」)。a.this@swap(this):这是调用带接收者函数的语法,等价于a.(this@swap)(this),或者更直白的this@swap.invoke(a, this)。- 本质是:以
a(A的实例)作为原函数的接收者,传入this(B的实例)作为原函数的参数,调用原函数并返回结果。
- 本质是:以
实际例子辅助理解
假设我们有一个原函数:
fun String.concatWithPrefix(prefix: Char): String = "$prefix$this"
它的类型是String.(Char)->String(对应A=String, B=Char, C=String)。
调用swap后得到新函数:
val swappedConcat = String::concatWithPrefix.swap()
新函数的类型是Char.(String)->String,我们可以这样调用它:
val result = '!'.swappedConcat("Kotlin") println(result) // 输出 "!Kotlin"
这个调用对应的lambda逻辑就是:
a是"Kotlin"(A类型),this是'!'(B类型)- 执行
a.this@swap(this)→"Kotlin".concatWithPrefix('!'),结果和直接调用原函数完全一致,只是接收者和参数的位置互换了。
内容的提问来源于stack exchange,提问作者tu tu
相关产品推荐
相关产品推荐

