菊花链连接猫王操作员?



这有点丑陋:

override var x1: Double = 0.0 //x-coordinate for object
get() =
if(hasParent) { //if there is no parent, we can't have an x coord anyway - nowhere to draw this object
if (hasPrev) { //we won't always have a previous event, thus the other branch
prev!!.x2 + parent!!.mEventSpacing
} else {
parent!!.mEventStartX
}
} else {
field
}

是否可以将其替换为以下内容?

override var x1: Double = 0.0
get() = (prev?.x2 + parent?.mEventSpacing) ?: parent?.mEventStartX ?: field

逻辑显然不对,但有接近这个的东西吗?还是需要一些认真的粉丝才能做这么简单的事情?

假设hasParent = parent != nullhasPrev = prev != null.
还假设parentprev被定义为val,而不是在ifwhen语句中var,因为我不喜欢多次添加!!

您正在做的是,使用when表达式:

override var x1: Double = 0.0 //x-coordinate for object
get() = when {
parent != null && prev != null -> prev.x2 + parent.mEventSpacing
parent != null && prev == null -> parent.mEventSpacing
parent == null -> field
}

您可以使用?.话务员和let功能的组合(请参阅安全呼叫部分):

override var x1: Double = 0.0 //x-coordinate for object
get() =
parent?.let { pr -> prev?.let { pv -> pv.x2 + pr.mEventSpacing } ?: pr.mEventSpacing } ?: field

let函数执行参数块,其参数称为let,并返回参数块中的最后一个表达式。

例如,1.let { it + 2 }3

如果x不为 null,则x?.let执行let函数。 即,x?.let { ... }if (x != null) x.let { ... } else null)相同。

这里

如果parent == null,那么
parent?.let { pr -> prev?.let { pv -> pv.x2 + pr.mEventSpacing } ?: pr.mEventSpacing }就是null

如果parent != null
parent?.let { pr -> prev?.let { pv -> pv.x2 + pr.mEventSpacing } ?: pr.mEventSpacing }prev?.let { pv -> pv.x2 + parent!!.mEventSpacing } ?: parent!!.mEventSpacing相同

如果prev == null,则可以将prev.x2视为0。所以

override var x1: Double = 0.0 //x-coordinate for object
get() =
parent?.let { pr -> (prev?.let { pv -> pv.x2 } ?: 0) + pr.mEventSpacing } ?: field

您可以通过在内部let函数中使用it来进一步缩短此时间。

override var x1: Double = 0.0 //x-coordinate for object
get() =
parent?.let { pr -> (prev?.let { it.x2 } ?: 0) + pr.mEventSpacing } ?: field

此外,您可以使用runlet的组合。(谷歌kotlin runkotlin run vs let,如果你不知道的话。

override var x1: Double = 0.0 //x-coordinate for object
get() =
parent?.run { (prev?.let { it.x2 } ?: 0) + mEventSpacing } ?: field

但我认为使用when是最容易理解的。


好吧,如果parentprev被定义为var,那么将when表达式与!!一起使用可以引发NPE,而使用?.let?.run?:永远不会在多核设备中引发NPE。为了防止这种情况,您可以使用 getter 函数中的当前值定义局部val,这样您就永远不需要使用!!运算符。

最新更新