Kotlin闭包解决逻辑与运算

Kotlin闭包解决逻辑与运算,kotlin,closures,Kotlin,Closures,我想创建一个闭包,其中包含所有布尔表达式和方法,并给出最终结果 像这样的 myAnd{ 23<34 false someFunction() //returns true } 但该解决方案在使用and运算符时不会提供短路电源使用块来实现短路和 这是通过将每个谓词作为块传递来实现的,这意味着可以逐个计算它们,如果其中任何一个返回false,那么所有谓词都将立即返回false,使其余谓词短路。使用块实现短路和 这是通过将每个谓词作为块传递来实现的,这意味着

我想创建一个闭包,其中包含所有布尔表达式和方法,并给出最终结果 像这样的

  myAnd{
    23<34
    false
    someFunction() //returns true
    }
但该解决方案在使用and运算符时不会提供短路电源

使用块来实现短路和 这是通过将每个谓词作为块传递来实现的,这意味着可以逐个计算它们,如果其中任何一个返回false,那么所有谓词都将立即返回false,使其余谓词短路。

使用块实现短路和
这是通过将每个谓词作为块传递来实现的,这意味着可以逐个计算它们,如果其中任何一个返回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。->单位,a,这样我就可以传递一个lambda,它在BooleanBuilder lambda接收器的范围内。这对于使用成员扩展名Boolean.unaryPlus是必要的,该扩展名再次启用+Boolean,如图所示。

我可以想出一个快速解决方案来启用以下用法:

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。->单位,a,这样我就可以传递一个lambda,它在BooleanBuilder lambda接收器的范围内。这是使用成员扩展Boolean.unaryPlus所必需的,该扩展再次启用+Boolean,如图所示。

谢谢您的回答,但是有没有办法通过使用闭包而不是将lambdas作为方法的参数来使其惯用?这是更惯用的解决方案。这里确实需要3个闭包,而不是1个,因为像这样使用单个闭包相当于{someFunction}:它只计算前两行并忽略它们的值。谢谢你的回答,但是有没有办法通过使用闭包而不是将lambdas作为method的参数来让它更为惯用呢?这是一个更为惯用的解决方案。这里确实需要3个闭包,而不是1个,因为像这样使用单个闭包相当于{someFunction}:它只计算前两行并忽略它们的值。此解决方案对我的效果与预期一样,但您能否对函数myAdd及其工作原理进行一点说明,并且此解决方案不遵循短路补充一个简要说明此解决方案对我的效果与预期一样,但您能否对其进行一点说明函数myAdd及其工作原理,此解决方案不遵循短路添加了简要说明