Kotlin 可以动态为对象绑定一个额外对象吗?

我有一个方法,每次都必须传入一个固定的对象 paint,因为这个函数会被频繁调用,所以我不能在内联函数中创建对象。

inline fun Canvas.drawPoint(
    point: PointF,
    paint: Paint) {
    drawPoint(point.x, point.y, paint)
}

但是我很多地方都会调用这个方法。

          //(Canvas.apply(..,..))
            drawPoint(pointA, pointPaint)
            drawPoint(pointB, pointPaint)
            drawPoint(pointC, pointPaint)
            drawPoint(pointD, pointPaint)

可以看到每次都会传入一个pointPaint对象。
所以我在想有没有类似这样一个功能

        //(Canvas.apply(..,..))
            bind(pointPaint)
            drawPoint(pointA)
            drawPoint(pointB)
            drawPoint(pointC)
            drawPoint(pointD)


不负相思意
浏览 1225回答 2
2回答

蝴蝶刀刀

&nbsp; &nbsp; fun test() {&nbsp; &nbsp; &nbsp; &nbsp; Canvas().bindPaintDrawPoints(Paint())(&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; arrayOf(PointF(1f, 2f),&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; PointF(2f, 2f),&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; PointF(3f, 2f),&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; PointF(4f, 2f))&nbsp; &nbsp; &nbsp; &nbsp; )&nbsp; &nbsp; }&nbsp; &nbsp; fun Canvas.bindPaintDrawPoints(paint: Paint): (Array<PointF>) -> Unit {&nbsp; &nbsp; &nbsp; &nbsp; return {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; drawPoints(paint, it)&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; fun Canvas.drawPoints(paint: Paint, points: Array<PointF>) {&nbsp; &nbsp; &nbsp; &nbsp; for (p in points) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.drawPoint(p.x, p.y, paint)&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }

萧十郎

完美符合你要求的方式肯定是没有的,因为 bind 函数不可能改变另一个函数内部的局部变量。折中的方式也有很多,比如定义一个包级属性:var&nbsp;drawPaint:&nbsp;Paint?&nbsp;=&nbsp;null然后原来的函数改为:inline&nbsp;fun&nbsp;Canvas.drawPoint( &nbsp;&nbsp;&nbsp;&nbsp;point:&nbsp;PointF, &nbsp;&nbsp;&nbsp;&nbsp;paint:&nbsp;Paint)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;paint?.let&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;drawPoint(point.x,&nbsp;point.y,&nbsp;it) &nbsp;&nbsp;&nbsp;&nbsp;} }方便使用还可以再定义一个函数来确保 drawPaint 能被准确的赋值和释放:fun&nbsp;bindPaint(paint:&nbsp;Paint,&nbsp;action:&nbsp;()&nbsp;->&nbsp;Unit)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;drawPaint&nbsp;=&nbsp;paint &nbsp;&nbsp;&nbsp;&nbsp;action() &nbsp;&nbsp;&nbsp;&nbsp;drawPaint&nbsp;=&nbsp;null}这样使用时就是://&nbsp;Canvas().apply&nbsp;{bindPaint(somePaint)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;drawPoint(x,&nbsp;y) }还有一种方式是定义一个包装类,并在其中定义一个包含带接收者 Lambda 表达式的参数的函数(接收者为 Canvas),然后将扩展函数定义到这个类中:class&nbsp;PointPainter(private&nbsp;val&nbsp;paint:&nbsp;Paint)&nbsp;{&nbsp;&nbsp; &nbsp;&nbsp;fun&nbsp;Canvas.drawPoint(rect:&nbsp;RectF)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;drawPoint(rect.x,&nbsp;rect.y,&nbsp;paint) &nbsp;&nbsp;&nbsp;&nbsp;} }然后定义含有接收者为这个包装对象 Lambda 参数的函数:fun&nbsp;bindPointPainter(paint:&nbsp;Paint,&nbsp;drawAction:&nbsp;PointPainter.()&nbsp;->&nbsp;Unit)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;PointPainter(paint).drawAction() }这样用时更方便一些://&nbsp;in&nbsp;canvas.apply&nbsp;blockbindPointPainter(somePaint)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;drawPoint(rect1) &nbsp;&nbsp;&nbsp;&nbsp;drawPoint(rect2)&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;...}
打开App,查看更多内容
随时随地看视频慕课网APP