Закрытие Kotlin для решения логики и операции - PullRequest
0 голосов
/ 12 мая 2018

Я хочу создать замыкание, где он принимает все логические выражения и методы, дает окончательный результат как то так

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

поэтому ответ будет ложным

Решение, с которым я пришел, это

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

myAnd(true , false ,someFunction())

но это решение не даст возможности короткого замыкания при использовании и оператора

Ответы [ 2 ]

0 голосов
/ 12 мая 2018

Я могу придумать быстрое решение, которое позволяет использовать следующее:

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 (приемник лямбды). Это необходимо для использования расширения члена Boolean.unaryPlus, которое снова позволяет использовать + boolean, как показано.

0 голосов
/ 12 мая 2018

Использование блоков для реализации короткого замыкания и

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, замкнув остальные из них.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...