簡體   English   中英

Kotlin閉包解決邏輯和操作

[英]Kotlin closure to solve logical and operation

我想創建一個包含所有布爾表達式和方法的閉包,並給出最終結果,如下所示

  myAnd{
    23<34
    false
    someFunction() //returns true
    }

所以答案將是錯誤的

我附帶的解決方案是這樣

fun myAnd(vararg flags: Boolean) = flags.all { it }

myAnd(true , false ,someFunction())

但是此解決方案在使用和操作員時不會產生短路的力量

使用模塊實現短路和

fun someFunction() = true

fun and(vararg parameters: ()->Boolean): Boolean {
    return parameters.all { it() }
}

fun main(args: Array<String>) {
    and (
            {23<34},
            {false},
            ::someFunction
    )
}

這是通過將每個謂詞作為一個塊傳入來實現的,這意味着它們可以被一個一個地求值,並且如果任何一個謂詞返回false,那么所有謂詞都會立即返回false,從而使其余謂詞短路。

我可以想到一種實現以下用途的快速解決方案:

val boolResult: Boolean = myAnd {
    + (23 < 34)
    + false
    + someFunction() //returns true
}

以下是相關代碼:

fun myAnd(bb: BooleanBuilder.() -> Unit) = BooleanBuilder().apply { bb() }.result

class BooleanBuilder {
    var bools = listOf<Boolean>()
    operator fun Boolean.unaryPlus() {
        bools += this
    }

    fun result() = bools.all { it }
}

說明:這是自定義DSL的輕量示例。 有趣的部分是BooleanBuilder.() -> Unit ,它是帶有接收器函數文字 ,因此我可以傳遞一個在BooleanBuilder (lambda的接收器)范圍內的lambda。 使用成員擴展Boolean.unaryPlus是必需的,該成員擴展再次允許使用+ boolean ,如圖所示。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM