Kotlin如何将类内扩展方法转换为带接收者的lambda表达式?
解答
存在对应的语法糖,你可以直接通过带分发接收者的成员引用语法完成赋值,不需要额外包装lambda:
class SomeClass{ val logger = ... fun (String).capitalizeLast():String { logger.info("capitalizeLast called") return this.substring(0,this.length-1) + this.substring(this.length-1,this.length).toUpperCase() } // 直接通过this::引用类内部的成员扩展函数 val asLambda: (String).()->String = this::capitalizeLast }
说明
你定义的capitalizeLast属于类内成员扩展函数,这类函数同时存在两个接收者:
- 扩展接收者:就是扩展函数的操作对象
String实例 - 分发接收者:就是扩展函数所属的外部类
SomeClass实例
因此引用这类函数时,需要在::前加上分发接收者的实例(这里就是当前类的实例this),就可以直接得到符合(String)->String类型的带接收者函数实例。
如果该扩展函数是定义在顶层(不在任何类内部),直接用::capitalizeLast引用即可,不需要加前缀。
内容的提问来源于stack exchange,提问作者caeus
相关产品推荐
相关产品推荐

