Шаг 220.
Основы Kotlin.
Расширения. Задания для самостоятельного решения
На этом шаге мы рассмотрим приведем несколько практических заданий с возможными решениями.
Здесь мы предлагаем вам выполнить несколько заданий, направленных на закрепление изученного материала.
Задание 1: расширение toDragonSpeak()
В этом задании вернитесь в Tavern.kt. Преобразуйте функцию toDragonSpeak() в приватную функцию-расширение внутри Tavern.kt.
Раскрыть/скрыть решение и комментарии.
Приведем текст преобразовываемой функции:
. . . .
val phrase = if (name == "Dragon's Breath") {
"$patronName exclaims: ${toDragonSpeak("Ah, delicious $name!")}"
} else {
"$patronName says: Thanks for the $name."
}
. . . .
private fun toDragonSpeak(phrase: String) =
phrase.replace(Regex("[aeiouAEIOU]")) {
when (it.value) {
"a", "A" -> "4"
"e", "E" -> "3"
"i", "I" -> "1"
"o", "O" -> "0"
"u", "U" -> "|_|"
else -> it.value
}
. . . .
Из приведенного текста видно,что расширение нужно применить к строке:
Соответственно, это расширение будем создавать для класса String, и оно будет принимать в качестве аргумента строку. Текст расширения может быть таким:
private fun String.toDragonSpeak(phrase: String) =
phrase.replace(Regex("[aeiouAEIOU]")) {
when (it.value) {
"a", "A" -> "4"
"e", "E" -> "3"
"i", "I" -> "1"
"o", "O" -> "0"
"u", "U" -> "|_|"
else -> it.value
}
Вызов этого расширения может быть таким:
"$patronName exclaims: ".toDragonSpeak("Ah, delicious $name!")
Задание 2: расширение рамок
Следующий пример - это маленькая программа, позволяющая вывести произвольную строку в красивой ASCII-рамке, которую можно распечатать и повесить на стену:
fun String.frame(name: String, padding: Int, formatChar: String = "*"): String {
val greeting = "$name!"
val middle = formatChar.padEnd(padding)
.plus(greeting)
.plus(formatChar.padStart(padding))
val end = (0 until middle.length).joinToString("") { formatChar }
return "$end\n$middle\n$end"
}
В этом задании вы примените знания о расширениях. Попробуйте преобразовать функцию frame() в расширение, которое можно использовать с любой строкой. А вот и пример того,
что у вас должно получиться:
print("Welcome, Madrigal".frame(5))
. . . .
****************************
* Welcome, Madrigal! *
****************************
Раскрыть/скрыть решение и комментарии.
Из текста примера видно, что расширение также применяется к строке, поэтому будем его реализовывать для класса String.
Кроме того, нужно их списка параметров убрать строку name, а в тексте расширения будем работать с ней, используя this.
С учетом сказанного текст расширения может быть таким:
fun String.frame(padding: Int, formatChar: String = "*"): String {
val greeting = "$this!"
val middle = formatChar.padEnd(padding)
.plus(greeting)
.plus(formatChar.padStart(padding))
val end = (0 until middle.length).joinToString("") { formatChar }
return "$end\n$middle\n$end"
}
Использование такого расширения в заданном примере:
print("Welcome, Madrigal".frame(5))
приведет к требуемому результату.
Со следующего шага мы начнем рассматривать основы функционального программирования.
Предыдущий шаг
Содержание
Следующий шаг