使用擴充套件功能來提高可讀性

在 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 要求不可空。