4. Изучите значения по умолчанию и компактные функции
В этом задании вы узнаете о значениях по умолчанию для параметров функций. Вы также познакомитесь с компактными функциями , которые могут сделать ваш код более лаконичным и читаемым, а также сократить количество путей выполнения кода для тестирования. Компактные функции также называются функциями с одним выражением .
Шаг 1: Создайте значение по умолчанию для параметра.
В Kotlin вы можете передавать аргументы по имени параметра. Вы также можете указывать значения по умолчанию для параметров: если аргумент не указан вызывающей стороной, используется значение по умолчанию. Впоследствии, при написании методов (функций-членов), это позволяет избежать создания множества перегруженных версий одного и того же метода.
- В файле Hello.kt напишите
swim()функцию сStringпараметромspeed, которая выводит скорость рыбы.speedПараметр имеет значение по умолчанию"fast".
fun swim(speed: String = "fast") {
println("swimming $speed")
}
- Из
main()функции можно вызвать еёswim()тремя способами. Сначала вызовите функцию, используя значение по умолчанию. Затем вызовите функцию, передавspeedпараметр без указания имени, а затем вызовите функцию, указав имяspeedпараметра.
swim() // uses default speed
swim("slow") // positional argument
swim(speed="turtle-like") // named parameter
⇒ swimming fast swimming slow swimming turtle-like
Шаг 2: Добавьте необходимые параметры
Если для параметра не указано значение по умолчанию, всегда необходимо передавать соответствующий аргумент.
- В файле Hello.kt напишите
shouldChangeWater()функцию, которая принимает три параметра:day,temperature, иdirtyуровень. Функция возвращает значениеtrue, указывающее, следует ли менять воду (это происходит, если сегодня воскресенье, если температура слишком высокая или если вода слишком грязная). День недели обязателен, но температура по умолчанию равна 22, а уровень загрязнения по умолчанию равен 20.
Используйте whenвыражение без аргумента, которое в Kotlin действует как серия if/else ifпроверок.
fun shouldChangeWater (day: String, temperature: Int = 22, dirty: Int = 20): Boolean {
return when {
temperature > 30 -> true
dirty > 30 -> true
day == "Sunday" -> true
else -> false
}
}
- Укажите
shouldChangeWater()датуfeedTheFish()и время вызова.dayПараметр не имеет значения по умолчанию, поэтому необходимо указать аргумент. Два других параметраshouldChangeWater()имеют значения по умолчанию, поэтому передавать для них аргументы не требуется.
fun feedTheFish() {
val day = randomDay()
val food = fishFood(day)
println ("Today is $day and the fish eat $food")
println("Change water: ${shouldChangeWater(day)}")
}
=> Today is Thursday and the fish eat granules Change water: false
Шаг 3: Создание компактных функций
Выражение when, которое вы написали на предыдущем шаге, содержит много логики в небольшом объеме кода. Если бы вы хотели немного упростить его или если бы условия проверки были более сложными, вы могли бы использовать несколько локальных переменных с подходящими именами. Но в Kotlin это делается с помощью компактных функций.
Компактные функции, или функции с одним выражением , — это распространенный шаблон в Kotlin. Когда функция возвращает результат одного выражения, вы можете указать тело функции после символа =, опустить фигурные скобки {}и опустить return.
- В файле Hello.kt добавьте компактные функции для проверки условий.
fun isTooHot(temperature: Int) = temperature > 30
fun isDirty(dirty: Int) = dirty > 30
fun isSunday(day: String) = day == "Sunday"
- Измените код
shouldChangeWater(), чтобы вызывать новые функции.
fun shouldChangeWater (day: String, temperature: Int = 22, dirty: Int = 20): Boolean {
return when {
isTooHot(temperature) -> true
isDirty(dirty) -> true
isSunday(day) -> true
else -> false
}
}
println()Запустите свою программу . ВыводshouldChangeWater()должен быть таким же, как и до перехода на использование компактных функций.
Значения по умолчанию
Значение по умолчанию для параметра не обязательно должно быть значением. Это может быть другая функция, как показано в следующем фрагменте примера:
fun shouldChangeWater (day: String, temperature: Int = 22, dirty: Int = getDirtySensorReading()): Boolean {
...