在代码A中,参数x1
和x2
使用相同的值,运行良好。
我认为我可以改进代码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会得到相同的值。