[英]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.