Перейти к содержанию

🗒 Задача

Программируем робота. Робот умеет говорить и работать с модификаторами речи. Речь реализуется методом say(). Модификатор устанавливается функцией setModifier(), принимающей лямбду.

Робот произносит одну из случайных 5 фраз (придумай фразы самостоятельно). Реализуй модификатор, инвертирующий слова робота.

В результате в главной функции должен быть воспроизведен такой алгоритм: – Вызов say(). Метод печатает одну фразу в обычном виде. – Вызов setModifier(). Устанавливает переданный в него модификатор строки. – Вызов say(). Метод выводит одну фразу в инвертированном виде.

❌ Ошибки

✏️ Комментарии

У тебя `println()` оборачивается внутрь другого `println()`. Тем самым в консоль печатается значение, которое возвращает метод, который ничего не возвращает при его исполнении – `kotlin.Unit`. Нужно печатать только фразу, либо это может быть актуально, когда необходимо распечатать метод, возвращающий определенное значение.
Лучше хранить фразы внутри класса робота. Будем полагать, что это часть его сущности.
Фразы можно хранить как поле в классе робота, а не создавать при каждом вызове `say()`
Лучше присвой свойству `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()
}