我经常看到代码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
}
两种方法都很好,但这取决于你想要达到的目标。
它就像let
和apply
的作用域函数
代码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)
}
两者同样正确。这取决于你想为来电者提供什么样的体验。