Шаг 212.
Основы Kotlin.
Расширения. Свойства-расширения

    На этом шаге мы рассмотрим задание и использование таких свойств.

    Кроме функций-расширений, добавляющих новые возможности, также можно объявлять свойства-расширения. Добавьте еще одно расширение для String в Extensions.kt, на этот раз свойство-расширение, подсчитывающее гласные.

val String.numVowels
    get() = count { "aeiouy".contains(it) }

fun String.addEnthusiasm(amount: Int = 1) = this + "!".repeat(amount)
.   .   .   .


Рис.1. Добавление свойства-расширения (Extensions.kt)

    Испытайте свое новое свойство-расширение numVowels в main().

val String.numVowels
    get() = count { "aeiouy".contains(it) }

fun String.addEnthusiasm(amount: Int = 1) = this + "!".repeat(amount)

fun <T> T.easyPrint(): T {
    println(this)
    return this
}

fun main(args: Array<String>) {
    "Madrigal has left the building".easyPrint().addEnthusiasm().easyPrint()
    42.easyPrint()
    "How many vowels?".numVowels.easyPrint()
}

Файл с проектом можно взять здесь.


Рис.2. Использование свойства-расширения (Extensions.kt)

    Запустите Extensions.kt. Вы увидите вывод нового свойства numVowels:

Madrigal has left the building 
Madrigal has left the building!
42
5


Рис.3. Результат работы приложения

    Ранее мы говорили, что свойства класса (кроме вычисляемых свойств) имеют поля, в которых хранятся фактические данные, и для них автоматически создаются методы чтения, а если надо - методы записи. Подобно вычисляемым свойствам, свойства-расширения не имеют полей. Для них должны явно определяться операторы get() и/или set(), вычисляющие возвращаемое значение.

    Например, нельзя объявить такое свойство:

var String.preferredCharacters = 10
error: extension property cannot be initialized because it has no backing field

    Зато можно объявить свойство-расширение preferredCharacted с методом чтения для val prefferedCharacters.

    На следующем шаге мы рассмотрим расширения для типов с поддержкой null.




Предыдущий шаг Содержание Следующий шаг