Назначения Kotlin не выражения. Любой другой способ заставить утверждения быть включенными? - PullRequest
0 голосов
/ 10 мая 2018

В настоящее время я изучаю Kotlin, и один из способов сделать это - автоматическое преобразование кода Java в Kotlin и изучение результатов. Одним из фрагментов кода Java, который я пытался преобразовать, является следующий статический блок в классе, который пытается обеспечить включение утверждений:

static {
    boolean assertsEnabled = false;
    assert assertsEnabled = true;
    if (!assertsEnabled)
        throw new AssertionError("Please enable assertions!");
}

Это основывается на выражении assertsEnabled = true в качестве аргумента assert. В Java присваивания являются выражениями. В Котлине это не так, и поэтому это нельзя преобразовать. Есть ли другой способ сделать это?

1 Ответ

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

К сожалению, у Kotlin нет ключевого слова assert со специальной семантикой.Вместо этого он имеет следующую функцию:

inline fun assert(value: Boolean, lazyMessage: () -> Any)

Вы можете видеть, что выражение, переданное в качестве первого аргумента, вычисляется безоговорочно.Это означает, что вы не можете добиться такой же легкой проверки, как в Java;вы должны вызвать фактическую ошибку подтверждения, чтобы убедиться.

Так что вам нужна проверка, предложенная @Zoe:

try {
    assert(false)
    throw IllegalStateException("Please enable assertions!")
} catch (e: AssertionError) {
    // Things are looking good; carry on
}

Если вы настаиваете на броске AssertionError вместоIllegalStateException, вы можете использовать для этого логическую переменную.

var assertionsAreDisabled = false
try {
    assert(false)
    assertionsAreDisabled = true
} catch (e: AssertionError) {
    // Things are looking good; carry on
}
if (assertionsAreDisabled) {
    throw AssertionError("Please enable assertions!")
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...