是块:(画布:画布)->单位相当于块:画布。() -> 科特林的单位?

  • 本文关键字:画布 单位 是块 相当于 kotlin
  • 更新时间 :
  • 英文 :


我经常看到代码B,很少看到代码A。

代码A正确吗?

Kotlin中的block: (canvas: Canvas) -> Unit是否等于block: Canvas.() -> Unit?

代码

fun DrawScope.drawNormal(block: (canvas: Canvas) -> Unit) {
drawIntoCanvas {
block(it)
}
}

代码B

fun DrawScope.drawNormal(block: Canvas.() -> Unit) {
drawIntoCanvas {
block(it)
}
}

代码A声明了一个接受Canvas作为参数的函数。你将能够使用画布使用it或通过命名它。

drawNormal { canvas ->
// do whatever you want with canvas
}

在代码B中,您正在使用(如@gidds所说)带有receiver的函数字面量。您提供了一个将运行匿名函数的作用域。因此,在匿名函数中,this将是画布。

drawNormal {
// no parameters, you can simply use all canvas functions in this block
}

两种方法都很好,但这取决于你想要达到的目标。

它就像letapply的作用域函数

代码A将是更好的,如果你只是想获得画布属性,如宽度和长度,以建立另一个东西或做一些动作与它。

如果你想修改,代码B会更好画布引用(如修改宽度和长度)

从函数调用者的角度来看,它们是不相等的。

在代码A中,block是一个将Canvas作为参数的函数。这意味着drawNormal的调用者将作为it或通过lambda中的命名参数访问它:
drawNormal {
it.rotate(90f)
}
drawNormal { canvas ->
canvas.rotate(90f)
}

代码B中,block是将Canvas作为接收者的函数。这意味着调用者将作为this访问它,或者直接从Canvas调用函数:

drawNormal {
this.rotate(90f)
rotate(90f)
}

两者同样正确。这取决于你想为来电者提供什么样的体验。

最新更新