Будет ли extension функция написанная внутри класса иметь доступ к полям этого класса в Kotlin

Ответ

Нет, extension-функции, объявленные внутри класса, не имеют доступа к его приватным полям. Они ведут себя как обычные extension-функции, просто ограничены областью видимости класса.

class MyClass(private val secret: String) {
    fun String.printSecret() {
        println(secret) // Ошибка: Cannot access 'secret'
    }
}

Extension-функции — это статические функции, которые принимают экземпляр класса (receiver) как первый параметр. Они не являются членами класса и не наследуют его область видимости.

Ответ 18+ 🔞

А, ну это классика, ёпта! Сидишь такой, думаешь: "Сейчас объявлю extension внутри класса — и он будет как родной, всё видеть!" А тут тебе — хуй с горы!

Смотри, что происходит. Extension-функции — это по сути статичные утилитки, которые компилятор хитро подсовывает. Они принимают объект первым невидимым параметром. И всё! Они не сидят внутри твоего объекта, они снаружи. Это как будто сосед через забор кричит: "Эй, Вася, дай мне твой секретный ключ от сарая!" А Вася ему: "Иди ты нахуй, я тебя даже не знаю".

Вот твой код, ядрёна вошь:

class MyClass(private val secret: String) {
    fun String.printSecret() {
        println(secret) // Ошибка: Cannot access 'secret' — Ну естественно, блядь!
    }
}

Функция printSecret — она вообще не про MyClass. Она про String! Ей похуй, в каком классе её объявили. Ей дали на вход строку (receiver), и всё. А к приватному полю secret другого, постороннего объекта она доступа не имеет, доверия ебать ноль. Это два разных мира.

Если хочешь, чтобы extension видел приватные поля, то делай его членом класса (простой функцией) или объявляй внутри тела класса как локальную extension, но это уже другая история, обычно бессмысленная. А так — да, запомни: extension-функция, даже объявленная в классе, это просто статик-метод, который притворяется своим. Пизда рулю этой идее.

Короче, не выйдет схитрить. Хочешь работать с приватным — делай обычный метод. Всё гениальное просто, а всё хитрожопое — не работает.