🗒 Задача¶
Программируем робота. Робот умеет говорить и работать с модификаторами речи. Речь реализуется методом say(). Модификатор устанавливается функцией setModifier(), принимающей лямбду.
Робот произносит одну из случайных 5 фраз (придумай фразы самостоятельно). Реализуй модификатор, инвертирующий слова робота.
В результате в главной функции должен быть воспроизведен такой алгоритм: – Вызов say(). Метод печатает одну фразу в обычном виде. – Вызов setModifier(). Устанавливает переданный в него модификатор строки. – Вызов say(). Метод выводит одну фразу в инвертированном виде.
❌ Ошибки¶
✏️ Комментарии¶
У тебя `println()` оборачивается внутрь другого `println()`. Тем самым в консоль печатается значение, которое возвращает метод, который ничего не возвращает при его исполнении – `kotlin.Unit`. Нужно печатать только фразу, либо это может быть актуально, когда необходимо распечатать метод, возвращающий определенное значение.
Лучше присвой свойству `modifier` дефолтное значение лямбды, которое ничего не делает. То есть принимает на вход строку и возвращает ее же.
Давай сделаем так, чтобы функция `setModifier()` только устанавливала модификатор. То есть мы сюда отправляем то действие, которое надо совершить со строкой.
`lateinit` – заманчивая конструкция, но опасная и никак не спасающая от `NullPointerException`. Лучше стараться продумать подходящее поведение по-умолчанию. В данном случае - просто говорить слова без изменений.
Решение может быть таким. Давай сделаем так, чтобы функция `setModifier()` только устанавливала модификатор. То есть мы сюда отправляем то действие, которое надо совершить со строкой.
Что значит устанавливать модификатор? Можно добавить свойство в класс с модификатором по умолчанию `private var modifier: (String) -> String = { it }`
В методе установки модификатора, который принимает лямбду – задавать новый переданный модификатор (по сути метод) объявленному выше свойству.
Метод говорения будет использовать этот модификатор, который будет уже хранить определенную строку `println(modifier(randomString))`
🧾 Решение¶
class Robot42 {
private val phrases = listOf(
"Привет",
"Меня зовут робот Борис",
"Я - передовая отечественная разработка",
"Но на самом деле",
"Я - человек, одетый в костюм работа",
"ХА-ХА-ХА",
"Как мы всех заскамили?",
)
private var modifier: (String) -> String = { it }
fun say() {
println(modifier(phrases.random()))
}
fun setModifier(modifier: (String) -> String) {
this.modifier = modifier
}
}
fun main() {
val robo = Robot42()
robo.say()
robo.setModifier { str: String ->
str.reversed()
}
robo.say()
}