使用扩展功能来提高可读性

在 Kotlin 你可以编写如下代码:

val x: Path = Paths.get("dirName").apply { 
    if (Files.notExists(this)) throw IllegalStateException("The important file does not exist")
}

但是 apply 的使用并不清楚你的意图。有时创建类似的扩展函数更为清晰,实际上重命名动作并使其更加不言而喻。这不应该被允许失控,但对于非常常见的行为,例如验证:

infix inline fun <T> T.verifiedBy(verifyWith: (T) -> Unit): T {
    verifyWith(this)
    return this
}

infix inline fun <T: Any> T.verifiedWith(verifyWith: T.() -> Unit): T {
    this.verifyWith()
    return this
}

你现在可以将代码编写为:

val x: Path = Paths.get("dirName") verifiedWith {
    if (Files.notExists(this)) throw IllegalStateException("The important file does not exist")
}

现在让人们知道 lambda 参数中的内容。

请注意,verifiedBy 的类型参数 TT: Any? 相同,这意味着甚至可以为空的类型将能够使用该版本的扩展。虽然 verifiedWith 要求不可空。