我如何分配一个变量与另一个变量的值在Kotlin?



在代码A中,参数x1x2使用相同的值,运行良好。

我认为我可以改进代码A,所以我写代码B,但它失败了。

如何将x1的值赋给x2

代码

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
)
}

代码B

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

代码中的x1 = ...,x2 = ...等实际上不是赋值语句!它们是命名参数。

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

语法恰好被设计成与赋值类似,使左侧看起来像是刚刚声明了一个新变量。如果语法使用:而不是=,您还会有这种困惑吗?

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

所以x2 = x1没有意义——在那个位置没有x1这样的变量。x1只是参数的名称,只有当drawChildnAxis内时,该参数才在作用域中。

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

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

如果您不希望x之后可访问,请使用作用域函数:

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

当然,所有这些都是假设toX没有副作用——对同一对象调用两次getter会得到相同的值。

最新更新