Использование переменной класса в функции расширения класса

#kotlin

#kotlin

Вопрос:

Я выполняю упражнение Kotlin Koans по функциям расширения коллекции и мне интересно, как переменная customers может быть обнаружена из функции:

 fun Shop.getSetOfCustomers(): Set<Customer> = customers.toSet()

data class Shop(val name: String, val customers: List<Customer>)

data class Customer(val name: String, val city: City, val orders: List<Order>) {
    override fun toString() = "$name from ${city.name}"
}

data class Order(val products: List<Product>, val isDelivered: Boolean)

data class Product(val name: String, val price: Double) {
    override fun toString() = "'$name' for $price"
}

data class City(val name: String) {
    override fun toString() = name
}
  

Ответ №1:

Когда вы пишете функцию расширения, вы можете записать ее, как если бы вы находились внутри класса в реальном методе. Таким образом, внутри расширения на Shop , this ссылается на Shop экземпляр, к которому было вызвано расширение, и this.customers также доступен (поскольку он общедоступен, вы не можете получить доступ к закрытым элементам в расширении).

Тогда, как и внутри класса, вы также можете опустить this при ссылке на свойство или функцию того же класса, следовательно, только customer в расширении.

Комментарии:

1. Спасибо, не могли бы вы также сказать мне, почему я получаю здесь ошибку вывода типа? fun Shop.checkAllCustomersAreFrom(city: City): Boolean = customers.all(it.city == city) — вывод такой, Boolean и я возвращаю Boolean , поэтому он должен работать.

2. Разве последний набор скобок (round brackets) не должен быть фигурными скобками?

3. Спасибо, что сработало — но почему это в фигурных скобках? @gidds В документах есть закругленные скобки: kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections /…