#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 /…