在代码A中,参数x1x2使用相同的值,工作正常.

我想我可以改进代码A,所以我写了代码B,但失败了.

如何将x2赋值为x1

Code A

val stepWidth = step * index
it.drawChildnAxis(
   x1 = stepWidth.toX, y1 = 0f.toY,
   x2 = stepWidth.toX, y2 = yAxisLength.toY
)

fun Canvas.drawChildnAxis(x1:Float, y1:Float,x2:Float,y2:Float){
    drawLine(
        Offset(x = x1, y = y1),
        Offset(x = x2, y = y2),
        paintTableAxisChild
    )
}

Code B

it.drawChildnAxis(
   x1 = step * index.toX, y1 = 0f.toY,
   x2 = x1, y2 = yAxisLength.toY
)

//The same

推荐答案

代码中的x1 = ...x2 = ...等实际上不是assignment statements!他们是named arguments岁.

没有变量x1x2等在函数调用时突然变为作用域,允许您为其赋值.这只是一种语法,可以让您说出参数的名称,使代码更具可读性,有时还可以解决重载解析的歧义.

语法恰好被设计为类似于赋值,使左侧看起来像刚刚声明的新变量.如果语法使用:而不是=,您还会有这种混淆吗?

it.drawChildnAxis(
   x1: stepWidth.toX, y1: 0f.toY,
   x2: stepWidth.toX, y2: yAxisLength.toY
)

所以x2 = x1没有意义——在这个位置上没有x1这样的变量.x1只是一个参数的名称,只有当您是inside drawChildnAxis时,它才在范围内.

如果要避免重复,只需自己创建一个新变量!

val x = stepWidth.toX
it.drawChildnAxis(
   x1 = x, y1 = 0f.toY,
   x2 = x, y2 = yAxisLength.toY
)

如果不想在之后访问x,请使用scope函数:

stepWidth.toX.let { x ->
    it.drawChildnAxis(
        x1 = x, y1 = 0f.toY,
        x2 = x, y2 = yAxisLength.toY
    )
}

当然,所有这些都是假设toX没有副作用——在同一件事上调用它的getter两次会得到相同的值.

Kotlin相关问答推荐

我可以在kotlin/java.util.scanner中跳过分隔符而不重复吗?

在Spring Boot应用程序中使用网络请求功能将关键字挂起作为冗余

用Quarkus和Reactor重写异步过滤器中的数据流

如何在 Android Jetpack Compose 中的画布上绘制一侧加厚的描边?

如何从kotlin中的ArrayList中删除所有元素

在 APK META-INF/library_release.kotlin_module 中复制的重复文件

如何将超过 2 个 api 调用的结果与 Coroutines Flow 结合起来?

如何使 TextInputEditText 只读?

Kotlin - mutableMapOf() 会保留我输入的顺序

在 Koin 中提供一个 Instance 作为其接口

片段内的 Kotlin 按钮 onClickListener 事件

未在IntelliJ IDEA上运行临时文件

如何在 Kotlin 中传递有界通配符类型参数?

Kotlin使用运行时断言进行空判断?

Android 上的 Kotlin:将map到list

Android EditText 协程go 抖操作符,如 RxJava

如何使用协调器布局和行为在CardView上完成此动画?

Android Kotlin 创建类实现 Parcelable 在 writeToParcel 方法的 override中给出错误

spring.config.location 在 Spring Boot 2.0.0 M6 上不起作用

Kotlin flatMap - map