我是Kotlin的新手和编程。 我非常喜欢模式匹配的想法,正如您在下面的代码中看到的那样,我正在尝试使用when语句。
<div class="tradeoff-cell">
<span class="tradeoff-title">Lower RL Rate</span>
<div class="tradeoff-icon"><svg class="svg-inline--fa fa-chart-line fa-w-16" aria-hidden="true" data-prefix="fa" data-icon="chart-line" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" data-fa-i2svg=""><path fill="currentColor" d="M500 384c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12H12c-6.6 0-12-5.4-12-12V76c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v308h436zM456 96H344c-21.4 0-32.1 25.9-17 41l32.9 32.9-72 72.9-55.6-55.6c-4.7-4.7-12.2-4.7-16.9 0L96.4 305c-4.7 4.6-4.8 12.2-.2 16.9l28.5 29.4c4.7 4.8 12.4 4.9 17.1.1l82.1-82.1 55.5 55.5c4.7 4.7 12.3 4.7 17 0l109.2-109.2L439 249c15.1 15.1 41 4.4 41-17V120c0-13.3-10.7-24-24-24z"></path></svg><!-- <i class="fa fa-line-chart" aria-hidden="true"></i> -->
</div>
</div>
如果您运行代码,结果为:
fun main(args: Array<String>) {
val myAr = arrayOf(1,2,3)
val myL = listOf(1,2,3)
fun probablyBlind() {
when(myL.size != myAr.size) {
myL.size > myAr.size -> {
println("myL.size > myAr.size = ${myL.size > myAr.size}")
}
myL.size < myAr.size -> myAr.forEach { println(it) }
}
if(myL.size != myAr.size) {
println("Inside if. myL.size > myAr.size =
${myL.size > myAr.size}")
}
}
probablyBlind()
}
这意味着在某些时候列表的大小与数组的大小不同。 然后它在when语句中计算为true的第一个比较。 但后来打印出来的是虚假的。这意味着它不应该运行这部分代码。 if语句永远不会计算为true。
有人可以帮我吗? 也许这是我目前无法看到的非常简单的事情。 如果是这样的话,请原谅。
答案 0 :(得分:9)
when(myL.size != myAr.size)
您在此指定when
- 表达式为Boolean
值,即比较MyL.size
和myAr.size
的结果。我们说它们是平等的,这意味着您搜索值为false
的匹配项。
myL.size > myAr.size
- 您的第一个when
- 条款。由于大小相等,因此评估为false
并匹配when表达式。
你真正想说的只是
when {
myL.size > myAr.size -> {
println("myL.size > myAr.size = ${myL.size > myAr.size}")
}
myL.size < myAr.size -> myAr.forEach { println(it) }
}
答案 1 :(得分:1)
以下只是展示另一种可能性,它可能在更复杂的场景中有意义。
您可以将比较结果包装到一些对象中,使when
子句看起来很好,如下所示:
fun probablyBlind() {
when (ComparisonResult.of(myAr.size, myL.size)) {
Equal -> {
println("equally sized")
}
RightGreater -> println("myL.size > myAr.size = ${myL.size > myAr.size}")
LeftGreater -> myAr.forEach { println(it) }
}
}
要使其正常工作,只需创建以下包装器:
sealed class ComparisonResult {
companion object {
fun of(t1: Int, t2: Int): ComparisonResult = when {
t1 == t2 -> Equal
t1 > t2 -> LeftGreater
t1 < t2 -> RightGreater
else -> throw IllegalStateException()
}
}
}
object Equal : ComparisonResult()
object LeftGreater : ComparisonResult()
object RightGreater : ComparisonResult()