You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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函数,拆解每个部分:

  1. 最内层的this:这个lambda属于B.(A)->C类型,所以它的接收者是B的实例,这里的this就指代这个B实例(也就是调用swap后得到的新函数的接收者)。
  2. this@swap:@swap是标签限定符,用来明确this的作用域——这里的this@swap指的是swap函数的接收者,也就是原来的那个A.(B)->C类型的函数实例(下称「原函数」)。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 17:25:19