Kotlin关闭解决逻辑和操作

时间:2018-05-11 21:01:10

标签: kotlin closures

我想创建一个闭包,它接受所有布尔表达式和方法,给出最终结果 像这样的东西

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

所以答案是假的

我带来的解决方案就是这个

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

myAnd(true , false ,someFunction())

但是这个解决方案在使用和运算符

时不会给出短路的能力

2 个答案:

答案 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,如图所示。