我想创建一个闭包,它接受所有布尔表达式和方法,给出最终结果 像这样的东西
myAnd{
23<34
false
someFunction() //returns true
}
所以答案是假的
我带来的解决方案就是这个
fun myAnd(vararg flags: Boolean) = flags.all { it }
myAnd(true , false ,someFunction())
但是这个解决方案在使用和运算符
时不会给出短路的能力答案 0 :(得分:3)
-Dwebdriver.driver="iexplorer"
这可以通过将每个谓词作为一个块传递来实现,这意味着可以逐个对它们进行求值,如果它们中的任何一个返回false,那么all将立即返回false,将其余部分短路。
答案 1 :(得分:2)
我可以想到一个能够实现以下用途的快速解决方案:
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css'],
animations: [
trigger('animationOption1', [
state('start', style({
backgroundColor: 'yellow',
width: '150px',
height: '150px'
})),
state('end', style({
backgroundColor: 'green',
width: '300px',
height: '300px'
})),
transition('start => end', animate(1500)),
transition('end => start', animate('800ms 0.5s ease-out'))
]),
trigger('animationOption2', [
state('close', style({
opacity: 0,
backgroundColor: 'yellow'
})),
state('open', style({
opacity: 1,
backgroundColor: 'green'
})),
transition('close <=> open', animate(3000)),
])
]
})
export class AppComponent {
isMenuOpen = false;
clickedDivState = 'start';
changeDivState() {
this.clickedDivState = 'end';
setTimeout(() => {
this.clickedDivState = 'start';
}, 3000);
}
toggleMenu(): void {
this.isMenuOpen = !this.isMenuOpen;
}
}
以下是相关代码:
val boolResult: Boolean = myAnd {
+ (23 < 34)
+ false
+ someFunction() //returns true
}
说明:它是自定义DSL的轻量级示例。其中有趣的部分是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 }
}
,function literal with receiver,因此我可以传递一个在BooleanBuilder.() -> Unit
(lambda接收器)范围内的lambda。这是使用成员扩展名BooleanBuilder
的必要条件,再次允许使用Boolean.unaryPlus
,如图所示。