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

Я делаю Упражнение Котлина Коанса по функциям расширения коллекции и мне интересно, как можно обнаружить переменную 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
}
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
49
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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

Zorgan 10.03.2019 01:19

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

gidds 10.03.2019 01:35

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

Zorgan 10.03.2019 01:48

Другие вопросы по теме