You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在assertk中有没有更简洁的方式断言数组元素匹配指定谓词?

解决方案

方案1:简化现有matchesPredicate逻辑

直接用Kotlin标准库的zip+all函数替代手写遍历,代码更简洁,和原有逻辑完全等价:

fun Assert<DoubleArray>.isCloseTo(expected: DoubleArray, delta: Double) {
    hasSameSizeAs(expected)
    matchesPredicate { actual ->
        actual.zip(expected).all { (actualVal, expectedVal) ->
            actualVal.isCloseTo(expectedVal, delta)
        }
    }
}

// 修正原有代码参数名不统一的问题:入参是delta,内部判断统一用delta
fun Double.isCloseTo(expected: Double, delta: Double): Boolean {
    return abs(this - expected) <= delta
}

方案2:使用assertk原生API实现更优效果(完全符合伪代码预期)

assertk内置的containsExactly方法支持传入每个位置的断言规则,完全匹配你想要的按索引逐个校验元素的效果,而且断言失败时会自动输出不匹配的下标、实际值、期望值,错误提示比手写matchesPredicate友好得多:

import assertk.assertions.containsExactly
import assertk.assertions.support.closeTo

fun Assert<DoubleArray>.isCloseTo(expected: DoubleArray, delta: Double) {
    containsExactly(*expected.map { closeTo(it, delta) }.toTypedArray())
}

这个实现不需要单独调用hasSameSizeAs,containsExactly本身会先校验数组长度是否一致,长度不匹配时会直接抛出对应错误。同时你也不需要自己实现Double.isCloseTo扩展,assertk已经内置了对应的closeTo断言工具,直接导入即可使用。

内容的提问来源于stack exchange,提问作者Hakanai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 13:48:00