Kotlin如何定义并调用带上下文的高阶函数?
如何定义带上下文的高阶函数
针对你给出的Kotlin代码示例,要让上下文成为f的接收器,有两种可行的解决方案,具体如下:
方案一:使用上下文接收器函数类型
将参数f的类型从MyContext.() -> Unit改为context(MyContext) () -> Unit,外层函数的MyContext上下文会自动传递给f,直接调用f()即可生效:
interface MyContext { fun herp() } context(MyContext) fun contextualizedHigherOrderFunction(f: context(MyContext) () -> Unit) { f() // 正常调用,上下文自动传递 }
这种方式让高阶函数的参数f与外层函数共享同一个MyContext实例,上下文依赖关系更紧密。
方案二:明确指定扩展函数的接收器实例
如果需要保留f为MyContext.() -> Unit(扩展函数类型),可以通过this@MyContext获取当前函数上下文里的MyContext实例,以此作为接收器调用f:
interface MyContext { fun herp() } context(MyContext) fun contextualizedHigherOrderFunction(f: MyContext.() -> Unit) { this@MyContext.f() // 明确使用当前上下文实例作为接收器 }
this@MyContext专门指代context(MyContext)提供的上下文实例,完美匹配扩展函数f的接收器要求。
两种方案的选择取决于实际需求:若希望f的上下文依赖与外层函数强绑定,优先方案一;若需要f作为独立扩展函数灵活使用,方案二更合适。
内容的提问来源于stack exchange,提问作者F. P. Freely
相关产品推荐
相关产品推荐

