Успех и неудача в Kotlin
Класс Result можно собрать вручную, не только через
обертку над лямбдой. Функция Result.success кладет
готовое значение, Result.failure - исключение,
которое описывает причину отказа.
Так удобно возвращать итог проверки из функции, когда ошибка - ожидаемый вариант, а не сбой среды:
fun badgeFor(score: Int): Result<String> {
if (score < 0) {
return Result.failure(IllegalArgumentException("negative score"))
}
if (score >= 90) {
return Result.success("gold")
}
return Result.success("silver")
}
fun main() {
println(badgeFor(95))
println(badgeFor(-1))
}
Перед использованием значения внутри Result
смотрят флаги isSuccess и isFailure.
Они взаимно исключают друг друга для одного и того же
объекта:
fun badgeFor(score: Int): Result<String> {
if (score < 0) {
return Result.failure(IllegalArgumentException("negative score"))
}
if (score >= 90) {
return Result.success("gold")
}
return Result.success("silver")
}
fun main() {
val trial = badgeFor(72)
if (trial.isSuccess) {
println("ok")
}
if (trial.isFailure) {
println("reject")
}
}
Свойство isFailure срабатывает только там, где функция
вернула Result.failure. Для оценки 72
печатается "ok", ветка отказа не выполняется.
Проверим отказ на другом правиле - день недели:
fun openSlot(day: String): Result<Int> {
val allowed = setOf("mon", "wed", "fri")
if (day !in allowed) {
return Result.failure(IllegalStateException("closed"))
}
return Result.success(14)
}
fun main() {
val slot = openSlot("tue")
println(slot.isSuccess)
println(slot.isFailure)
}
Напишите функцию, которая по длине пароля возвращает
Result со строкой "strong", если
символов не меньше 8, иначе неудачу. Для
"kotlin" и "longpass" выведите
флаги успеха и неудачи через пробел в каждой строке.
Функция принимает код цвета из трех символов
Char. При 'R', 'G' или
'B' верните успех с числом 1,
2 или 3, иначе неудачу. Проверьте
'G' и 'X' и выведите только
isSuccess для каждого вызова.