Kotlin JS中扩展函数调用时首个参数是否用作接收者?
Kotlin带接收者构建器语法解惑
1. 带接收者函数类型的调用逻辑
SVGAttributes<*>.() -> Unit这种带接收者的函数类型,Kotlin在底层会把它处理成接收一个目标对象作为参数的函数,只是语法上允许你在lambda里直接用this指代这个目标对象。
当你调用building(obj)时,obj就被当作这个函数的接收者绑定进去了——lambda里的width = 100.0其实是this.width = 100.0,这里的this就是obj,所以能直接给obj添加属性。
2. 为什么obj.building()不生效
building是svgB的函数参数,它是一个独立的函数实例,并不是obj的成员方法。你用js("{}")创建的是空动态对象,本身没有building这个方法,自然没法通过obj.building()调用。
3. 调用svgB{ ... }时无需传接收者的原因
这是Kotlin的带接收者lambda语法糖:当函数的最后一个参数是带接收者的函数类型时,你可以把lambda写在函数括号外面,而且lambda内部的this会自动绑定到函数内部准备好的接收者对象(也就是svgB里的obj)。
你写的svgB{ width = 100.0 ... },本质上是Kotlin帮你完成了“把obj作为接收者传给lambda”的操作,不用你手动传入。
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

